java - java工厂模式实现中的错误

标签 java factory-pattern

我已阅读此主题以及有关如何使用工厂模式的说明
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/

相关文章:

java - 使用 joda time 提取秒数直到午夜

c# - 注入(inject)依赖困境的工厂模式和生命周期

C# 泛型和抽象工厂模式 - 或者做类似事情的某种方式

java - 工厂模式/ArrayList/接口(interface)问题

java - 什么时候使用抽象工厂模式?

c# - 通过 lambda 工厂与直接 "new Type()"语法创建对象

java - 实例化静态嵌套类而不限定封闭类

java - 如何在S60操作系统中运行.jar文件?

java - 使用与另一个列表的整个内容匹配的条目过滤列表的内容 Java 流

java - AOT 检测是什么意思?