我从以下位置借用了以下大多数代码(从// 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");
}
}
最佳答案
这是Java类模型中的一个基本限制。在类加载之前,不会向工厂注册该类的静态初始化程序运行。
解决此问题的最佳方法通常是Service Provider Interface,它使您可以列出在jar中实现某些接口的类,然后扫描所有匹配的实现。