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