描述没有代码的问题:
如果一个类的操作(否则满足工厂方法模式的结构)返回现有对象引用的副本,该副本由另一个对象的操作获取,并由它的已知类型使用,而不是实例化一个新对象 - 它可以吗?被归类为工厂方法?
此外,如果它被视为非工厂方法;创建 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: Design Patterns -book 的 Factory Method -part 的“Applicability” -section 的第 1 段:
“(使用工厂方法-模式,何时)..CreatorClass事先不知道,实例化的对象必须来自哪个ProductClass。”
[可能是一组不正确的单词;我使用翻译版本。]
- 它确实分配内存,用于保存对所选对象的引用。
- 它被类型转换为它的类型,由 Creator -class 知道。
- 它在 ConcreteCreator 类中定义(参考 GoF: Design Patterns -book 的 UML 图)。
(我的)反对的论点:
- 它使用现有对象,因此不会创建新实例。(这是必要的,语义方面的吗?)
- 它复制一个特定的对象,而不是一个特定的类。(给定实例可能具有现有的更改状态,而不是新构造的实例)
相关但单独的问题的帖子:
对他/她的问题的一般回答:Singleton Factory