工厂模式、抽象工厂模式和工厂方法模式

43

我对这三个术语感到非常困惑。

我的理解是:

  • 在工厂模式中,没有具体的工厂。根据参数构建新对象的工厂。

  • 在抽象工厂模式中,有多个具体工厂。客户端必须显式地创建不同的具体工厂。

这样说对吗?

还有其他的区别吗?

此外,什么是工厂方法模式?它与工厂模式相同吗?


设计模式:工厂模式 vs 抽象工厂模式? - jalf
3个回答

39

《设计模式:可复用面向对象软件的基础》(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 工厂类。

该类可以拥有 createWindowcreateButtoncreateScrollBar 等方法。随后,会定义几个实现以生产 Swing 组件或 AWT 或其他组件。然后,根据配置,实例化不同的类。

附加说明 - 具体工厂

我认为具体工厂是抽象工厂或工厂方法的任何非抽象实现。

所以,当我编写自己的 document 的泛化版本来覆盖 createElement 时,我创建的类就是一个具体工厂。

同样,WidgetFactory 将是一个抽象工厂,而 SwingWidgetFactory 将是一个具体工厂。


具体工厂也称为静态工厂。对象创建方法作为静态方法。 - Amit G

4

工厂模式:返回同一家族的对象
抽象工厂模式:返回多个家族的对象。

因此,可以说抽象工厂包含了多个工厂。


4
最好的学习方法无疑是阅读。 看看这个:http://www.dofactory.com/Patterns/Patterns.aspx
工厂方法将对象的创建推迟到子类中。这意味着定义了一个基类/接口,但客户端代码不会对该接口创建对象。实现该接口的子类负责初始化对象。
抽象工厂可以在这里找到:http://www.dofactory.com/Patterns/PatternAbstract.aspx#_self2 那个网站上已经有很好的信息了。下一个最好的选择是查看维基百科: http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29 http://javadesign-patterns.blogspot.com/ 是学习设计模式的好地方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接