据我所知:
抽象工厂模式提供了一个接口 创建一系列对象而工厂方法 提供了创建一个对象的界面。
如果这只是这些模式之间的差异,为什么要单独考虑它们?
答案 0 :(得分:3)
工厂方法已修复 - 您无法在运行时更改它。
抽象工厂允许您使用不同的工厂创建对象,可以在运行时选择,具体取决于某些条件。
Button button = WinButtonFactory.create(); //will always be a "windows button"
Button button = buttonFactory.create();
第二天的可以是WinButtonFactory extends ButtonFactory
或MacOSXButtonFactory extends ButtonFactory
。您可以根据当前操作系统传递其中一个。
答案 1 :(得分:3)
回顾这两种模式的定义告诉我们
Factory Method用于定义用于创建对象的界面,但让子类决定实例化哪个类。 Factory Method允许类将实例化延迟到子类。“
抽象工厂用于提供用于创建相关或依赖对象的系列的界面,而无需指定其具体类。
所以你说的是对的。工厂方法涉及创建(通常)一个对象,而抽象工厂涉及多个相关对象。
但那不是全部。如果你看看我在每个意图中加粗的第二个单词,就每个模式的作用机制而言,你会看到另一个区别。
Factory方法使用SUBCLASSES和继承将实例化委托给具体实现。这意味着要创建新产品,您必须继承“creator”类并覆盖工厂方法。反过来,该工厂方法返回所需的产品。
另一方面,Abstract Factory使用OBJECT组合(即工厂)进行委托。您必须在“product”类中进行代码更改,而不是在creator类中进行。具体来说,在产品类中,您定义了几个相关的产品(比如说产品的成分),每个产品都可以使用工厂OBJECT(在产品类中组成,并在运行时传递)创建。在这种情况下,创建者类只创建抽象产品,并将产品将使用的工厂传递给该产品。
然而,为了使事情有点混乱,抽象工厂中的中央抽象工厂通常实现工厂方法。这个中央工厂通常为所有成分定义一系列工厂方法,并将每种成分的创建委托给具体工厂。
希望它有所帮助。请记住,许多设计模式非常相似,实际上它们是相关的,例如看看Decorator模式和Adapter模式。大多数时候,两种设计模式之间的差异在于它们各自的意图。顺便说一句,关于设计模式的好书是我真正喜欢的Head First Design Pattern。并且发布了一个类似的问题here。
答案 2 :(得分:0)
抽象工厂模式意味着拥有工厂工厂(具体实施)。