Ori*_*ski 4 java design-patterns factory-pattern
来自 GoF 关于工厂方法模式的章节:
定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法让类将实例化推迟到子类。
其思想是让子类决定实例化哪个类,而GoF对这一思想的实现,就是在超类中提供一个抽象方法,子类需要重写该方法,从而提供自己的实例化逻辑。
我不明白的是,为什么使用抽象方法来实现它,而不是使用作为工厂的类成员。我会解释一下。
这是 GoF 的方式:
public abstract class Creator {
public void doStuff() {
Product product = createProduct();
/* etc. */
}
public abstract Product createProduct();
}
Run Code Online (Sandbox Code Playgroud)
用法:
MyCreator myCreator = new Creator() {
@Override
public Product createProduct() {
return new MyProduct();
}
}
myCreator.doStuff();
Run Code Online (Sandbox Code Playgroud)
但为什么要费心子类化等呢?我建议这种方法:
public class Creator {
private Factory factory;
/* constructor */
public Creator(Factory factory) {
this.factory = factory;
}
public void doStuff() {
Product product = factory.createProduct();
/* etc. */
}
}
Run Code Online (Sandbox Code Playgroud)
这就是你如何使用它:
MyFactory myFactory = new MyFactory();
Creator creator = new Creator(myFactory);
creator.doStuff();
Run Code Online (Sandbox Code Playgroud)
那么 GoF 的方法有什么好处呢?为什么不将Factory组合到Creator类中而不是使用抽象方法来表达它呢?
小智 5
为什么不将 Factory 组合到 Creator 类中而不是使用抽象方法来表达它呢?
因为在这种情况下,客户端“知道”要实例化什么工厂类,这违背了模式的整个目的。整个想法是,客户端不知道构建了什么工厂,它只调用一个抽象类。认为您将一些第三方工厂提供商插入到您的框架中,并且您不知道他们实例化什么(也不关心),只要服务于目的即可。
| 归档时间: |
|
| 查看次数: |
2592 次 |
| 最近记录: |