0

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

我的问题是 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");
    }
}
4

1 回答 1

3

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

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

于 2013-09-09T20:13:32.113 回答