工厂方法模式遵循模板模式,抽象工厂模式不遵循模板模式吗?

时间:2019-06-06 19:13:13

标签: design-patterns factory-pattern

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

enter image description here

“抽象工厂”具有以下结构:

enter image description here

为什么Creator有一个方法AnOperation()以工厂方法模式调用FactoryMethod(),而AbstractFactory没有一个调用CreateProductA()的方法并且CreateProductB()是“抽象工厂”模式吗?

Creator的方法AnOperation()调用FactoryMethod()遵循模板模式,其结构为

enter image description here

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

Factory方法或Abstract Factory模式都不是(“遵循”)Template Method设计模式的应用。尽管其解决方案模板的UML类图可能看起来相似,但它们实际上有助于实现不同的目标。

这两个工厂模式涉及允许子类自定义创建类型的对象的方式。有关不同工厂模式之间差异的讨论,请参见this post

Template Method设计模式与对象的创建无关,而与将变异点引入算法有关。

这就是说,这三种模式的共同点在于,它们将某些行为推迟给子类。请参见this post,以解决您的问题。

答案 3 :(得分:0)

我想你是说模板方法模式。

  

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

是的,确实如此。 工厂方法是一种模板方法。唯一的特别之处是,工厂方法可以创建并返回对象,而模板方法可以执行任何操作。

  

不是抽象的工厂模式吗?

不,不是。抽象工厂模式遵循策略模式,在策略模式中,使用 aggregation / composition 代替 inheritance