public interface Supplier {
  public void order(Product p, int quantity);
}

public class SupplierA implements Supplier {
  public void order(Product p, int quantity) {
    System.out.println("Enviar " + quantity + " " + p.toString());
  }
}

public class SupplierB implements Supplier {
  public void order(Product p, int quantity) {
    System.out.println("Encomenda recebida: " + p.toString());
  }
}

public abstract class Product {
  private String name;

  public Product(String name) {
    this.name = name;
  }
  public String toString() {
    return this.name;
  }

  public abstract Supplier createSupplier();
}

public class Screw extends Product {
  public Screw() {
    super("Parafuso");
  }

  public Supplier createSupplier() {
    return new SupplierA();
  }
}

public class Nail extends Product {
  public Parafuso() {
    super("Prego");
  }

  public Supplier createSupplier() {
    return new SupplierB();
  }
}

public class App {
  public static void main(String[] args) {
    Product[] p = { new Nail(), new Screw() };
    Supplier f = p[0].createSupplier();
    f.order(p[0], 4);
    f = p[1].createSupplier();
    f.order(p[1], 5);
  }
}