【发布时间】:2015-02-27 14:42:57
【问题描述】:
来自 GoF 关于工厂方法模式的章节:
定义创建对象的接口,但让子类决定创建哪个类 实例化。工厂方法允许类将实例化推迟到子类。
思路是让子类决定实例化哪个类,而GoF的实现思路是在超类中提供一个抽象方法,子类需要重写,从而提供自己的实例化逻辑。
我不明白的是,为什么使用抽象方法来实现它,而不是使用 是 工厂的类成员。我会解释的。
这是GoF方式:
public abstract class Creator {
public void doStuff() {
Product product = createProduct();
/* etc. */
}
public abstract Product createProduct();
}
用法:
MyCreator myCreator = new Creator() {
@Override
public Product createProduct() {
return new MyProduct();
}
}
myCreator.doStuff();
但是为什么要麻烦子类化等等呢?我建议这种方法:
public class Creator {
private Factory factory;
/* constructor */
public Creator(Factory factory) {
this.factory = factory;
}
public void doStuff() {
Product product = factory.createProduct();
/* etc. */
}
}
这就是你使用它的方式:
MyFactory myFactory = new MyFactory();
Creator creator = new Creator(myFactory);
creator.doStuff();
那么,GoF 的方法有什么好处?为什么不将 Factory 组合到 Creator 类中,而不是使用抽象方法来表达它?
【问题讨论】:
-
这是因为你想在上面的抽象类中的所有具体工厂之间共享公共代码。现在您所做的是正确的,但是如何在您的工厂之间共享/继承公共代码?因此使用抽象类更加灵活。
标签: java design-patterns factory-pattern