【问题标题】:Factory pattern design - clarifications工厂模式设计 - 说明
【发布时间】:2014-03-02 18:18:45
【问题描述】:

我已阅读以下有关工厂模式的文章here
请仅参考类注册 - 避免反射的简短部分。
此版本正在实现工厂和具体产品之间的减少耦合,而无需反射。

所以,我尝试自己实现这个版本,但没有成功。
原因是具体产品类的静态初始化器没有启动,因此没有在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();
    }
}

【问题讨论】:

  • 只要拿起 GOF 的 Design Patterns 书,它就是这个主题的经典。
  • @AdamArold:与他们在网站上所说的相反,您是否也认为 noob 实现是好的和非常合法的?
  • @AdamArold:我对他们的方法深信不疑,因为它毕竟是有道理的:工厂的 noob 实现每次都需要更改,因此它不灵活并且与具体类紧密耦合

标签: java oop design-patterns factory-pattern


【解决方案1】:

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

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

所以,总而言之,noob implementation 根本不是小菜一碟,它只是更简单并且适合某些用例。总的来说,在这种情况下,我不认为有 betterworsenoobie 实现,只是有不同的需求和用例。

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

【讨论】:

  • 谢谢你的评论,我必须说这很令人困惑,你有另一个可靠的学习java设计模式实现的网站吗?
  • 就像@AdamArold 所说,关于这个主题的最受欢迎的书是 GoF 的 Design Patterns,但是那里有很多关于同一主题的书,还有大量的文章你也可以用谷歌搜索,但是没有终极指南,你得自己去google很多次
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多