我对这三个术语感到非常困惑。
我的理解是:
在工厂模式中,没有具体的工厂。根据参数构建新对象的工厂。
在抽象工厂模式中,有多个具体工厂。客户端必须显式地创建不同的具体工厂。
这样说对吗?
还有其他的区别吗?
此外,什么是工厂方法模式?它与工厂模式相同吗?
我对这三个术语感到非常困惑。
我的理解是:
在工厂模式中,没有具体的工厂。根据参数构建新对象的工厂。
在抽象工厂模式中,有多个具体工厂。客户端必须显式地创建不同的具体工厂。
这样说对吗?
还有其他的区别吗?
此外,什么是工厂方法模式?它与工厂模式相同吗?
《设计模式:可复用面向对象软件的基础》(The Gang Of Four "Design Patterns; Elements of Reusable Object-Oriented Software")这本书中包含两个条目,“抽象工厂”(又称“虚拟构造器”)和“工厂方法”。至于“具体工厂”,我不太清楚。我听说过这个术语,但从未过多考虑过。
在“工厂方法”中,一个对象有一个负责创建另一个对象的方法。一个常见的例子是JavaScript文档对象和创建HtmlElement
对象:
var newDiv = document.createElement('div');
然而,这并不是一个很好的例子,因为工厂方法的一个重要部分是多态性。如果我可以扩展 document
来定义另一个类,并定义另一个 createElement
,那么这将是优秀的工厂方法材料。
抽象工厂旨在提供一个接口,用于创建相关或依赖对象系列,而不指定具体类。
典型的例子是 Widget 工厂;在 GoF 出版时期,跨平台 GUI 开发有点麻烦,因此可以定义一个抽象 Widget 工厂类。
该类可以拥有 createWindow
,createButton
,createScrollBar
等方法。随后,会定义几个实现以生产 Swing 组件或 AWT 或其他组件。然后,根据配置,实例化不同的类。
我认为具体工厂是抽象工厂或工厂方法的任何非抽象实现。
所以,当我编写自己的 document
的泛化版本来覆盖 createElement
时,我创建的类就是一个具体工厂。
同样,WidgetFactory
将是一个抽象工厂,而 SwingWidgetFactory
将是一个具体工厂。
工厂模式:返回同一家族的对象
抽象工厂模式:返回多个家族的对象。
因此,可以说抽象工厂包含了多个工厂。