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