我正在实施工厂模式这是我的工厂类:
class ProductFactory
{
private HashMap m_RegisteredProducts = new HashMap();
public void registerProduct (String productID, Class productClass)
{
m_RegisteredProducts.put(productID, productClass);
}
public Product createProduct(String productID)
{
Class productClass = (Class)m_RegisteredProducts.get(productID);
Constructor productConstructor = cClass.getDeclaredConstructor(new Class[] { String.class });
return (Product)productConstructor.newInstance(new Object[] { });
}
}
这是我的具体课程:
class OneProduct extends Product
{
static {
Factory.instance().registerProduct("ID1",OneProduct.class);
}
...
}
我的问题:
>如何强制执行所有具体实现来注册ID及其类对象? – 因为如果班级在工厂里没有这样注册,那么它就无法使用.
>我不能使用一个抽象类,它需要以某种方式将其所有子节点发送给父节点,强制执行此约束吗?像这样的东西:
public abstract class Product {
public Product(String name, Class productClass){
}
}
我在这里错过了什么吗?
最佳答案 在Java 8中你会写
class ProductFactory {
private final Map> m_RegisteredProducts =
new HashMap<>();
public ProductFactory registerProduct (String productID,
Function productFactory) {
m_RegisteredProducts.put(productID, productFactory);
return this;
}
public Product createProduct(String productID) {
return m_RegisteredProducts.get(productID).apply(productID);
}
}
注册
static {
Factory.instance().registerProduct("ID1", OneProduct::new)
.registerProduct("ID2", s -> new OneProduct("my" + s));
.registerProduct("ID3", s -> {
throw new AssertionError("Never create a " + s); });
}
OneProduct :: new与s – >非常相似;新的OneProduct(s)或
new Function() {
public Product apply(String s) {
return new OneProduct(s);
}
}
注意(1):Java 8将确保您具有可见的OneProduct(String)构造函数或无法编译.
注意(2):Java 7是公共支持终止.