java - 工厂方法模式的好处

标签 java design-patterns factory

我正在阅读 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 MethodWhy there are two separate patterns:Abstract Factory and Factory MethodWhat 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/

相关文章:

javascript - 从工厂获取 JSON 数据

c++ - 工厂能否通过查看特定文件以某种方式确定所有可能的类?

java - 可 ScrollView 与其他 subview (例如 Google 街景 View )交互

java - 设计问题 : enhance code reusability specific case

java - 需要在没有 wsdl 的情况下调用 soap ws

design-patterns - 游戏架构 : modeling different steps/types of UI

java - 我应该如何实现构建器的动态列表?

Python 和工厂

java - 使用 Hibernate 和 Jersey 的未知数据库异常

java - 如何在Java中处理JSONParser中不存在的数据