Java Factory Pattern如何让具体产品实例化

时间:2013-09-09 20:09:05

标签: java factory-pattern

我借用了以下大部分代码(从// start开始) http://www.oodesign.com/factory-pattern.html

我的问题是,除非我打电话,否则不会在ProductOne类中进行注册 的Class.forName( “ProductOne”) 在客户端代码中。

是否可以使ProductOne自包含? 换句话说,我的客户端代码只是

public class Main {
    public static void main(String[] args) {
        Product p = ProductFactory.instance().createProduct("ID1");
    }
}

不抛出NullPointerException?非常感谢!

//start

import java.util.HashMap;

public class ProductFactory {
    private static ProductFactory instance;
    private HashMap m_RegisteredProducts = new HashMap();

    private ProductFactory()
    {
        System.out.println("ProductFactory(): Initializing Instance");
    }

    public static ProductFactory instance()
    {
        if (instance==null)
            instance = new ProductFactory();

        return instance;
    }

    public void registerProduct (String productID, Product p)
    {
        m_RegisteredProducts.put(productID, p);
    }

    public Product createProduct(String productID)
    {
        return ((Product)m_RegisteredProducts.get(productID)).createProduct();
    }
}

public abstract class Product {
    public abstract Product createProduct();
}

public class ProductOne extends Product {
    static {
        ProductFactory.instance().registerProduct("ID1", new ProductOne());
    }

    public ProductOne()
    {
        System.out.println("Initializing ProductOne");
    }

    @Override
    public Product createProduct() {
        return new ProductOne();
    }
}

public class Main {
    static {
        try
        {
            Class.forName("ProductOne");
        }
        catch (ClassNotFoundException any)
        {
            any.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Product p = ProductFactory.instance().createProduct("ID1");
    }
}

1 个答案:

答案 0 :(得分:3)

这是Java类模型的一个基本限制;在类加载之前,使用工厂注册类的静态初始化程序将不会运行。

此问题的最佳解决方案通常是Service Provider Interface,它允许您列出在jar中实现某个接口的类,然后扫描所有匹配的实现。