为什么有两种不同的模式:抽象工厂和工厂方法

Why there are two separate patterns:Abstract Factory and Factory Method

如我所知:

抽象工厂模式为创建对象族而工厂方法提供用于创建一个对象的接口。

如果这只是这些模式之间的区别,为什么要分别考虑它们?


回顾一下这两种模式的定义,我们会发现

  • factory方法用于定义用于创建对象的接口,但让子类决定要实例化哪个类。工厂方法允许类将实例化推迟到子类。"

  • 抽象工厂用于提供一个接口,用于创建相关或依赖对象的族,而不指定它们的具体类。

所以你说的是对的。工厂方法涉及创建(通常)一个对象,而抽象工厂涉及几个相关的对象。

但这并不是全部。如果你看我在每个意图中用粗体显示的第二个词,你会发现在每个模式工作的机制方面还有另一个不同。

  • 工厂方法使用子类和继承将实例化委托给具体的实现。这意味着要创建新产品,必须继承"creator"类并重写factory方法。反过来,这个工厂方法返回所需的产品。

  • 另一方面,抽象工厂使用对象组合(即工厂)来委托。您必须在"产品"类中进行代码更改,而不是在创建者类中。具体地说,在产品类中,您定义了几个相关的产品(比如说产品的成分),每个产品都可以使用工厂对象创建(由产品类组成,并在运行时传递)。在这种情况下,creator类只创建抽象产品,并将产品将使用的工厂传递给该产品。

然而,为了让事情变得有点混乱,抽象工厂中的中心抽象工厂通常实现工厂方法。该中心工厂通常为所有配料定义一系列工厂方法,并将每种配料的创建委托给混凝土工厂。

希望有帮助。请记住,许多设计模式非常相似,实际上它们是相关的,例如,查看decorator模式和适配器模式。大多数时候,两种设计模式的区别在于它们各自的意图。一本关于设计模式的好书,顺便说一下,我真正喜欢的是头一个设计模式。这里也有一个类似的问题。


工厂方法是固定的-您不能在运行时更改它。

抽象工厂允许您创建具有不同工厂的对象,这些工厂可以在运行时根据某些条件进行选择。

1
2
Button button = WinButtonFactory.create(); //will always be a"windows button"
Button button = buttonFactory.create();

在第二种情况下,可以是WinButtonFactory extends ButtonFactoryMacOSXButtonFactory extends ButtonFactory。您可以根据当前操作系统传递一个或另一个。


抽象工厂模式意味着有一个工厂(具体实现)。