工厂模式实现中的错误java

Mistakes in realization of factory pattern java

我已阅读本主题以及有关如何使用工厂模式的说明
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 是空的。我做错了什么?

相关代码:

注册您的 class ExtentionFilterSerializer 的静态块只有在 class 路径上实现此单元 ExtentionFilterSerializer 时才会执行。如果您没有在程序中的任何地方使用此 class ExtentionFilterSerializer,则不会加载此 class,因此静态注册。

Class.forname("ExtentionFilterSerializer") 添加到您的客户端应用程序将解决加载问题。

关于使用的方法:

使用工厂模式的objective 是确定并创建具体对象类型的实例,尤其是在应用程序无法在编译时确定的情况下。通过添加一个静态初始值设定项来动态注册您的具体 class,您的工厂知道它的存在,但仍然无法确定要使用哪个具体 class。

此外,注册部分FilterFactory.creators.put(".", ExtentionFilterSerializer.class);不应该在ExtentionFilterSerializer中,而是在客户端程序中。

工厂设计模式的另一种变体使创建方法抽象化(与 AbstractFactory 模式不同)。可以使用那些看起来接近您的情况的具体工厂 classes 创建具体对象。阅读this

static 块(至少根据我的经验)在执行方面不是很可靠。您无法直接控制 ExtentionFilterSerializerstatic 块何时执行。

我宁愿实现一个 init() 方法,这样你就可以显式地调用 ExtentionFilterSerializer.init() (甚至可以添加一个参数来告诉方法应该将这个方法添加到哪个工厂)。

我刚刚使用了类似的结构,static 块非常不可靠,导致我将它们放在一个受控的 init() 函数中,该函数被提前调用。从这个时间点开始,您可以确定您的工厂和 ExtentionFilterSerializer 已正确初始化。

编辑:Post 下面我详细解释了会发生什么。实施 init() 或确保您的 class 实际上在某处。