工厂模式实现中的错误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
块(至少根据我的经验)在执行方面不是很可靠。您无法直接控制 ExtentionFilterSerializer
的 static
块何时执行。
我宁愿实现一个 init()
方法,这样你就可以显式地调用 ExtentionFilterSerializer.init()
(甚至可以添加一个参数来告诉方法应该将这个方法添加到哪个工厂)。
我刚刚使用了类似的结构,static
块非常不可靠,导致我将它们放在一个受控的 init()
函数中,该函数被提前调用。从这个时间点开始,您可以确定您的工厂和 ExtentionFilterSerializer
已正确初始化。
编辑:Post 下面我详细解释了会发生什么。实施 init()
或确保您的 class 实际上在某处。
我已阅读本主题以及有关如何使用工厂模式的说明
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
块(至少根据我的经验)在执行方面不是很可靠。您无法直接控制 ExtentionFilterSerializer
的 static
块何时执行。
我宁愿实现一个 init()
方法,这样你就可以显式地调用 ExtentionFilterSerializer.init()
(甚至可以添加一个参数来告诉方法应该将这个方法添加到哪个工厂)。
我刚刚使用了类似的结构,static
块非常不可靠,导致我将它们放在一个受控的 init()
函数中,该函数被提前调用。从这个时间点开始,您可以确定您的工厂和 ExtentionFilterSerializer
已正确初始化。
编辑:Post 下面我详细解释了会发生什么。实施 init()
或确保您的 class 实际上在某处。