【问题标题】:Implementation of factory design pattern missing link工厂设计模式缺失环节的实现
【发布时间】:2014-03-01 17:48:34
【问题描述】:

我在 this link 阅读了以下文章。

请参阅类注册 - 避免反射部分。

在此示例中,我无法理解以下代码行的含义:

static
{
    ProductFactory.instance().registerProduct("ID1", new OneProduct());
}

我不清楚的问题:
1.方法instance()在哪里定义?

2.实例方法是否应该是静态的,如果是,它的实现会是什么样子?
return this 不能通过静态方法实现)

*请坚持给定的示例,除非它是错误的,我正在尝试专注于一个工厂“配方”

【问题讨论】:

  • 只是一个建议 - 在进入工厂之前,请了解 static 方法,以及它们是如何被调用的。
  • ProductFactory,在这个例子中;似乎是使用singleton pattern 实现的。
  • @JBNizet:您是否认为始终需要将工厂实现为单例模式,如果不是,您是否知道如何重构给定示例以正常工作(没有工厂单例)?
  • 不,这并不总是必要的。使用和调整模式来解决特定问题。我不会在不知道问题的情况下推荐解决方案。
  • 您通常需要一个工厂来创建产品的许多实例。单例模式允许拥有一个工厂实例并从任何地方访问它。 (但它也有严重的缺点,尤其是在可测试性方面)。

标签: java oop design-patterns factory-pattern


【解决方案1】:

我正在尝试在下面回答您的问题:

1.方法instance()定义在哪里?

方法是在ProductFactory类中定义的,很明显。

2.实例方法是否应该是静态的,如果是,它的实现会是什么样子?

是的,应该是static。请看下面ProductFactoryinstance()类方法的定义:

public class ProductFactory extends Factory
{
    private static ProductFactory _instance;
    private HashMap m_RegisteredProducts = new HashMap();

    public static synchronized ProductFactory instance()
    {
        if (_instance == null)
            _instance = new ProductFactory();
        return _instance;
    }

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

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

【讨论】:

  • 所以我猜在这个例子中你将工厂实现为单例(双重检查锁定版本)模式?顺便问一下,如果我选择synchronized 而不是this 而不是ProductFactory.class,有什么区别?
  • 请看C#中这个双重检查锁的注释,它说它在没有volatile的java中不起作用,你明白吗?链接:csharpindepth.com/articles/general/singleton.aspx(第 3 版)
  • 您对不稳定的需求有何看法?
  • 我想说的是,如果你使用double-checked locking,你必须将实例声明为volatile。并且它不应该在J2SE 5.0 之前使用,因为它容易受到细微错误的影响。以上版本比double-checked locking更简洁干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多