【问题标题】:Does factory method pattern follow template pattern, and abstract factory pattern doesn't?工厂方法模式是否遵循模板模式,而抽象工厂模式不遵循?
【发布时间】:2019-06-07 12:56:54
【问题描述】:

在 Gamma 等人的设计模式中,“工厂方法”具有以下结构:

“抽象工厂”的结构如下:

为什么Creator在工厂方法模式中有一个方法AnOperation()来调用FactoryMethod(),而AbstractFactory在抽象工厂模式中没有一个方法来调用CreateProductA()CreateProductB()

Creator的方法AnOperation()callingFactoryMethod()是否遵循模板模式,其结构为

?

【问题讨论】:

  • 是的,两种模式都遵循模板模式。
  • 请看我之前的回答,它直接解决了这个问题:*.com/a/50786084/1371329

标签: design-patterns factory-pattern


【解决方案1】:

很简单:给定“一阶工厂”服务器创建目的(基本上,一堆正确完成的new 语句),“抽象工厂”或“更高阶工厂”是创建时的特殊情况对象本身就是..另一个工厂。这有点类似于列表列表。

附:您还可以拥有一个创建工厂的工厂,该工厂创建一个工厂。尽管完全符合“高阶工厂”的定义,但它在大多数实际情况下都没有用。

【讨论】:

    【解决方案2】:

    工厂是专门用于创建已定义类型的实例的类。这是工厂的唯一目的。另一方面,工厂方法可以存在于任何非工厂类型上。工厂方法图试图通过向类添加任意方法(在 UML 中称为操作)来表达这一点,以表明其主要目的不是创建某些其他类型的实例。

    当您将图表解释为 AnOperation() 正在调用 FactoryMethod() 时,您错了。该图显示Creator 是一个抽象类型,它具有一个名为FactoryMethod 的抽象方法和一个名为AnOperation 的具体(或非抽象)方法。 ConcreteCreator 派生自 Creator 并继承 AnOperatio()(在 UML 类规范中不再重复,因为它不是抽象的)和抽象 FactoryMethod()AnOperatio()FactoryMethod() 是两个独立的方法。 '

    【讨论】:

      【解决方案3】:

      工厂方法和抽象工厂模式都不是(“遵循”)模板方法设计模式的应用。尽管他们的解决方案模板的 UML 类图可能看起来很相似,但它们实际上有助于实现不同的目标。

      这两种工厂模式关注的是允许子类自定义如何创建特定类型的对象。有关不同工厂模式之间差异的讨论,请参阅 this post

      模板方法设计模式不关心对象的创建,而是将变化点引入算法。

      话虽如此,这三种模式的共同点是它们将某些行为推迟到子类。请参阅 this post 了解您的问题的另一种看法。

      【讨论】:

        【解决方案4】:

        我想你的意思是模板方法模式。

        工厂方法模式是否遵循模板模式?

        是的,确实如此。 工厂方法的方法就是模板方法的一种。唯一特别的是工厂方法创建并返回一个对象,而模板方法可以做任何事情。

        抽象工厂模式不行吗?

        不,它没有。抽象工厂模式遵循策略模式,其中使用聚合/组合而不是继承

        【讨论】:

        • 这个答案的前半部分是完全正确的。后半部分似乎暗示每一次组合的使用都是策略模式的一个实例。
        • 不,我不是那个意思。我刚刚提到了组合以与使用继承的工厂/模板方法模式进行比较。是的,我同意组合的每次使用都不一定是策略模式。
        • 抽象工厂使用组合;但我不会说它遵循策略模式。大多数 OO 模式使用组合。
        • 也许“跟随”这个词太强了,但 IMO 策略是使用组合模式最明显的例子。