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

Design patterns 为什么有两种不同的模式:抽象工厂和工厂方法,design-patterns,Design Patterns,在我看来: 抽象工厂模式为 使用factory方法创建对象族 提供用于创建一个对象的接口 如果这是这些模式之间的唯一区别,那么为什么要单独考虑它们?工厂方法是固定的-您不能在运行时更改它 抽象工厂允许您使用不同的工厂创建对象,这些工厂可以在运行时选择,具体取决于某些条件 Button button = WinButtonFactory.create(); //will always be a "windows button" Button button = buttonFactory.creat

在我看来:

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


如果这是这些模式之间的唯一区别,那么为什么要单独考虑它们?

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

抽象工厂允许您使用不同的工厂创建对象,这些工厂可以在运行时选择,具体取决于某些条件

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

第二个类似的例子可以是
WinButtonFactory扩展ButtonFactory
MacOSXButtonFactory扩展ButtonFactory
。根据当前操作系统的不同,您可以传递其中一种方法。

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

抽象工厂允许您使用不同的工厂创建对象,这些工厂可以在运行时选择,具体取决于某些条件

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

第二个类似的例子可以是
WinButtonFactory扩展ButtonFactory
MacOSXButtonFactory扩展ButtonFactory
。根据当前操作系统的不同,您可以传递一个或另一个。

抽象工厂模式意味着为工厂创建工厂(具体实现)。

抽象工厂模式意味着为工厂创建工厂(具体实现)。

回顾这两个模式的定义告诉我们

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

  • 抽象工厂用于提供一个接口,用于创建相关或从属对象的,而无需指定其具体类

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

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

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

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

然而,让人有点困惑的是,抽象工厂中的中心抽象工厂通常实现工厂方法。这个中心工厂通常为所有成分定义一系列工厂方法,并将每个成分的创建委托给具体工厂


希望能有所帮助。请记住,许多设计模式非常相似,事实上它们是相关的,例如,看看装饰器模式和适配器模式。大多数情况下,两种设计模式之间的差异在于它们各自的意图。顺便说一句,关于设计模式的一本好书,我非常喜欢。还有一个类似的问题uestion posted.

回顾一下这两种模式的定义告诉我们

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

  • 抽象工厂用于提供一个接口,用于创建相关或从属对象的,而无需指定其具体类

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

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

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

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

然而,让人有点困惑的是,抽象工厂中的中心抽象工厂通常实现工厂方法。这个中心工厂通常为所有成分定义一系列工厂方法,并将每个成分的创建委托给具体工厂

希望有帮助。请记住,许多设计模式非常相似,事实上它们是相关的,例如,看看装饰器模式和适配器模式。大多数情况下,两种设计模式之间的差异在于