设计模式语义:在示例中给出的操作可以归类为工厂方法吗?

时间:2013-10-21 02:17:12

标签: design-patterns semantics factory-pattern

描述无代码的问题:

如果 类'操作 (否则将实现Factory Method -pattern的结构),则返回现有对象引用的副本,该副本由另一个对象的操作获取,并使用它的已知类型,而不是实例化一个新对象 - 它可以被归类为工厂方法吗?

此外,如果它被认为是非工厂方法;创建ConcreteProduct的新实例的过程是否发生在ConcreteCreator中是否重要? (考虑到在JAVA中你总是最终会返回一个引用,所以只有实际的区别在于我们正在创建一个新实例而不是使用现有实例 - 但这是否会使我们有一个“完全不同”工厂方法“或不?”

JAVA中的一个最小示例:

interface Product { ... }
class ConcreteProductA { ... }
class ConcreteProductB { ... }

class ProductHolder
{
    private Product foo;

    /*
    * May return an instance of either ConcreteProductA or ConcreteProductB
    * Sets foo null, for attempting to mimic a composition relationship to holder, foo being moved into another composition relationship
    */
    public Product getProduct() {
        Product reference = foo;
        foo = null;
        return reference;
    }

    public void setProduct(Product foo) {
        this.foo = foo;
    }
}

interface Creator { public Product createProduct(); }

class ConcreteCreatorA implements Creator
{
    @Override
    public Product createProduct(ProductHolder holder) {
        return holder.getProduct();
    }
}

编辑: 注意我故意不选中方法是否返回null,这是否与问题有关?


(我的)参数:

  • (最重要的是)它符合GoF:设计模式 - 书的工厂方法 - 部分的“适用性”部分第1段:
  

“(使用Factory Method -pattern,when)..CreatorClass事先不知道实例化对象必须从哪个ProductClass。”

[可能是一组不正确的词;我使用翻译版本。]

  • 它确实分配内存,用于保存对所选对象的引用。
  • 它是类型的类型,由Creator -class知道。
  • 它在ConcreteCreator -class中定义(引用GoF:Design Patterns -book的UML图)。

(我的)反对意见:

  • 它使用现有对象,因此不会创建新实例。 (这是必要的,语义方面的吗?)
  • 它复制特定对象,而不是特定类。 (给定实例可能存在已更改的状态,而不是新构造的实例)

相关但单独的问题'帖子:

对他/她的问题的一般回答: Singleton Factory

1 个答案:

答案 0 :(得分:0)

阅读代码我假设会有一个ConcreteCreatorBC等等,其中至少有一些会真正新建对象而不是重用现有对象。

所以,我猜它仍然是一个Factory方法,只要这是真的。否则,它可能不是一个 - 我无法看到让它看起来像一个,给出createProduct()Creator等名称。