我已阅读此主题以及有关如何使用工厂模式的说明
factory pattern dynamic approach
我的工厂有这个
public class FilterFactory {
static Map<String, Class> creators;
static {
creators = new HashMap<>();
}
/*...*/
}
这是我想放入工厂的类之一
public class ExtentionFilterSerializer implements FilterSerializer {
static {
FilterFactory.creators.put(".", ExtentionFilterSerializer.class);
}
/*...*/
}
当我尝试在程序中使用工厂时,我看到 Map 是空的。我做错了什么?
最佳答案
代码相关:
仅当此单元 ExtentionFilterSerializer
在类路径上实现时,注册类 ExtentionFilterSerializer
的静态 block 才会执行。如果您没有在程序中的任何地方使用此类ExtentionFilterSerializer
,则不会加载此类,因此将进行静态注册。
向客户端应用程序添加 Class.forname("ExtentionFilterSerializer")
将解决加载问题。
关于使用的方法:
使用工厂模式的目标是确定并创建具体对象类型的实例,特别是当应用程序在编译时无法确定时。通过添加静态初始化程序来动态注册具体类,您的工厂知道它的存在,但仍然无法确定要使用哪个具体类。
此外,注册部分 FilterFactory.creators.put(".", ExtentionFilterSerializer.class);
永远不应位于 ExtentionFilterSerializer
中,而应位于客户端程序中。
工厂设计模式的另一个变体使创建方法变得抽象(与 AbstractFactory 模式不同)。可以使用这些具体的工厂类创建一个具体的对象,这看起来很接近您的情况。阅读 this 。
关于java - java工厂模式实现中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43249693/