工厂方法模式的好处

Benefits from factory method pattern

我正在阅读 Head First Design Patterns,我有一个问题。在书的开头我看到了这个原则:

Favor 'object composition' over 'class inheritance

然后我看到了

的工厂方法
abstract class Creator{
   abstract Product create(String type);
}

和子classing

class ConcreteCreator extends Creator{
    Product create(String type){
     //creation
    }
}

但是我们可以用简单工厂组合我们的class,比如

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 and the abstract factory pattern, for this see Differences between Abstract Factory Pattern and Factory Method and Why there are two separate patterns:Abstract Factory and Factory Method and What is the basic difference between the Factory and Abstract Factory Patterns?很重要。如您所见,这有点棘手,因此必须对我在下面所说的持保留态度。

特别是,您的 OurClass 示例在我看来是抽象工厂模式的典型用例。更具体地说,抽象工厂模式使您可以灵活地使正在创建的对象的具体类型成为 class 的参数,它的典型用例可以是 dependency injection (even though this is typically done in a more automated way), see also Dependency Injection vs Factory Pattern.

粗略地说,在抽象工厂模式中,您将对象的构造委托给外部 class(通常,这个 class 不仅负责创建一个相关对象,而且还负责创建多个相关对象),而在工厂方法模式中,您将对象的构造委托给 subclasses。也可以认为抽象工厂模式的创建方法是使用工厂方法模式

因此,对于何时使用工厂方法模式这个问题的一个简单回答如下:何时创建对象是 subclass 的责任。这意味着,只有 subclass 应该或可以决定需要创建什么对象,因此是 subclass 行为的一个方面,这使我们回到了最初的假设和归结为一个问题:什么时候应该使用继承?分别Prefer composition over inheritance?

另一方面,当外部因素决定需要创建哪些对象并且需要这种灵活性时,可以在您描述的情况下使用抽象工厂模式,从而证明代码需要额外的复杂性。