来自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的方法有什么好处呢?为什么不将工厂组合到创建者类中,而是使用抽象方法来表达它呢?