gpt4 book ai didi

java - 工厂模式设计——说明

转载 作者:行者123 更新时间:2023-11-30 09:11:20 29 4
gpt4 key购买 nike

我已阅读以下有关工厂模式的文章 here
请仅引用Class Registration - avoiding reflection这一部分。
这个版本在没有反射的情况下实现了工厂和具体产品之间的减少耦合。

所以,我尝试自己实现这个版本,但没有成功。
原因是具体产品类的静态初始化器没有启动,因此它们没有在 hashmap 中注册,所以用 createProduct 方法调用 ProductFactory 实例没有成功。

当我在工厂外部的客户端中初始化一些具体类时,这导致静态初始化程序启动并且具体类注册良好。之后我调用了 ProductFactory.getInstance().createProduct(productID)最终创建了具体类。

所以问题是:

这个站点示例是否遗漏了什么?
给定示例中的静态初始值设定项是如何触发的?

与此示例相关的代码是(来自网站):

abstract class Product
{
public abstract Product createProduct();
...
}

class OneProduct extends Product
{
...
static
{
ProductFactory.instance().registerProduct("ID1", new OneProduct());
}
public OneProduct createProduct()
{
return new OneProduct();
}
...
}

class ProductFactory
{
public void registerProduct(String productID, Product p) {
m_RegisteredProducts.put(productID, p);
}

public Product createProduct(String productID){
return ((Product)m_RegisteredProducts.get(productID)).createProduct();
}
}

最佳答案

是的,他们遗漏了一些东西,就像在反射示例中,类必须在客户端之前加载,否则它不会在工厂中注册,我认为这不是一个非常干净的方法,因为工厂客户必须在请求之前加载该类,这使得 productId 几乎没有用,并将客户与特定产品实现耦合起来。

我喜欢他们(不公平地)称之为菜鸟实现的东西,我认为它是使用最广泛的,并且有充分的理由,它更简单,使用它您实际上可以封装和集中对象的创建,而无需客户端除了特定产品的 id 之外什么都不知道(没有直接类加载),当您计划让 ProductFactory 客户端注册新产品实现而无需修改时,其他实现很有用工厂本身的代码,但在大多数情况下,您会发现在新实现出现时修改工厂并不是什么大问题。

因此,总而言之,noob 实现 根本不是 noobie,它只是更简单并且适合某些用例。总的来说,在这种情况下,我认为没有更好更差noobie实现,只是不同的需求和用例。

提示:为productId 使用枚举而不是字符串会更干净、更安全,也就是说,当然,如果您可以在每次新产品推出时都修改枚举实现进来。

关于java - 工厂模式设计——说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22131430/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com