因为我现在正在阅读设计模式,所以我有一个"新手"至少对我来说有趣的问题要问。
什么工厂实施最好?我已经看过创建方法硬编码的工厂,如果添加了新的子类型,我需要编辑该方法。例如:
public class ProductFactory{
public Product createProduct(String ProductID){
if (id==ID1)
return new OneProduct();
if (id==ID2) return
return new AnotherProduct();
... // so on for the other Ids
return null; //if the id doesn't have any of the expected values
}
...
}
这似乎是占用最少资源的实现。但是,我还看到了使用反射的实现:
class ProductFactory
{
private HashMap<String, Class> 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[] { });
}
}
这似乎是最慢的,因为它使用反射来工作。最后一个实现似乎占用了大部分RAM,因为它存储了一个特定类的额外实例。
class ProductFactory
{
private HashMap<String, Product> m_RegisteredProducts = new HashMap<>();
public void registerProduct(String productID, Product p) {
m_RegisteredProducts.put(productID, p);
}
public Product createProduct(String productID){
((Product)m_RegisteredProducts.get(productID)).createProduct();
}
}
上一家工厂的产品类:
abstract class Product
{
public abstract Product createProduct();
...
}
class OneProduct extends Product
{
...
static
{
ProductFactory.instance().registerProduct("ID1", new OneProduct());
}
public OneProduct createProduct()
{
return new OneProduct();
}
...
}
倒数第二个和最后一个实现都允许注册新产品而无需修改工厂类,例如要注册的产品扩展/实现类中的静态块。这是否更好?如果是这样,那两个实施中哪一个更好?或者硬编码实现更好,因为它似乎需要更少的资源。
答案 0 :(得分:1)
方法1)参数化工厂实施。加班我们创建了一个新的Product对象,我们必须修改Factory。
方法2)我们不需要修改工厂以添加新的实现。此外,工厂需要事先知道所有可用的类,以便开始实例化它们。性能不是一个因素,因为在现代JVM中,反射的性能损失可以忽略不计。
方法3)如果我理解正确,产品正在暴露工厂方法。 Product by Polymorphism的每个实现都负责提供实例创建的逻辑。虽然我不明白你将如何使用完全非静态的方法。如果你使用静态,你就会失去多态性。方法3对我来说不是很清楚。产品实际上是真实产品的包装物吗?
方法1的灵活性最低