最好的工厂实施

时间:2016-07-17 18:21:25

标签: java design-patterns factory-pattern

因为我现在正在阅读设计模式,所以我有一个"新手"至少对我来说有趣的问题要问。

什么工厂实施最好?我已经看过创建方法硬编码的工厂,如果添加了新的子类型,我需要编辑该方法。例如:

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();
    }
    ...
}

倒数第二个和最后一个实现都允许注册新产品而无需修改工厂类,例如要注册的产品扩展/实现类中的静态块。这是否更好?如果是这样,那两个实施中哪一个更好?或者硬编码实现更好,因为它似乎需要更少的资源。

1 个答案:

答案 0 :(得分:1)

方法1)参数化工厂实施。加班我们创建了一个新的Product对象,我们必须修改Factory。

方法2)我们不需要修改工厂以添加新的实现。此外,工厂需要事先知道所有可用的类,以便开始实例化它们。性能不是一个因素,因为在现代JVM中,反射的性能损失可以忽略不计。

方法3)如果我理解正确,产品正在暴露工厂方法。 Product by Polymorphism的每个实现都负责提供实例创建的逻辑。虽然我不明白你将如何使用完全非静态的方法。如果你使用静态,你就会失去多态性。方法3对我来说不是很清楚。产品实际上是真实产品的包装物吗?

方法1的灵活性最低