我正在阅读 Head First Design Patterns,我有一个问题。在书的开头我看到了这个原则:
Favor 'object composition' over 'class inheritance
然后我看到了工厂方法
abstract class Creator{
abstract Product create(String type);
}
和子类化
class ConcreteCreator extends Creator{
Product create(String type){
//creation
}
}
但是我们可以用简单工厂组合我们的类,比如
class OurClass{
SimpleFactory factory;
void ourMethod(){
Product product = factory.create(String type);
}
void setFactory(SimpleFactory factory){
this.factory = factory;
}
interface SimpleFactory {
Product create(String type);
}
class AnotherConcreteCreator implements SimpleFactory {
Product create(String type){
//creation
}
}
从第二种方法我们给出松耦合和可互换。但是工厂方法存在——所以有人需要它。工厂方法的优点是什么?
最佳答案
首先,区分 factory method pattern 很重要和 abstract factory pattern ,为此请参阅 Differences between Abstract Factory Pattern and Factory Method和 Why there are two separate patterns:Abstract Factory and Factory Method和 What is the basic difference between the Factory and Abstract Factory Patterns? .如您所见,这有点棘手,因此必须对我在下面所说的持保留态度。
特别是,您的 OurClass
示例在我看来是抽象工厂模式的典型用例。更具体地说,抽象工厂模式使您可以灵活地将正在创建的对象的具体类型作为类的参数,它的典型用例可以是dependency injection。 (即使这通常以更自动化的方式完成),另请参阅 Dependency Injection vs Factory Pattern .
粗略地说,在抽象工厂模式中,您将对象的构造委托(delegate)给外部类(通常,此类不仅负责创建一个相关对象,而且还负责创建多个相关对象),而在工厂方法模式中,您将将对象构造为子类。你也可以认为抽象工厂模式使用工厂方法模式作为它的创建方法。
因此,对于何时使用工厂方法模式这个问题的一个简单答案如下:何时创建对象是子类的责任。这意味着,只有子类应该或可以决定需要创建什么对象,因此是子类行为的一个方面,这使我们回到最初的假设并归结为问题:我什么时候应该使用继承? ,分别Prefer composition over inheritance? .
另一方面,当外部因素决定需要创建哪些对象并且需要这种灵 active 时,可以在您描述的情况下使用抽象工厂模式,从而证明代码需要额外的复杂性。
关于java - 工厂方法模式的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31702594/