design-patterns - 工厂、抽象工厂和工厂方法

标签 design-patterns factory factory-pattern abstract-factory

我对这三个术语真的很困惑。

我的理解是:

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

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

是吗?

还有哪些其他区别?

此外,什么是工厂方法模式?和工厂模式一样吗?

最佳答案

四人帮“设计模式;可重用面向对象软件的元素”一书包含两个条目,“抽象工厂”(又名“虚拟构造函数”)和“工厂方法”。我不知道“混凝土工厂”。我听说过这个词,但从未仔细考虑过。

工厂方法

在“工厂方法”中,一个对象有一个方法负责另一个对象的实例化。一个常见的示例是 JavaScript 文档对象和 HtmlElement 对象的创建:

var newDiv = document.createElement('div');

但这不是一个很好的例子,因为工厂方法的一个重要部分是多态性。如果我可以扩展 document 来定义另一个定义另一个 createElement 的类,这将是主要的工厂方法 Material 。

抽象工厂

抽象工厂旨在“提供一个接口(interface),用于创建相关或依赖对象系列,而无需指定具体类。

典型的直接的书本示例是 Widget Factory;在 GoF 发布的时候,跨平台 GUI 开发有点麻烦,所以你可以定义一个抽象的 widget 工厂类。

该类可以具有方法 createWindowcreateButtoncreateScrollBar 等。反过来,将定义多个实现来生成 Swing 小部件或 AWT管他呢。然后,根据配置,将实例化不同的类。

附录 - 混凝土工厂

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

因此,当我编写自己的 document 泛化(覆盖 createElement)时,我创建的类是一个具体工厂。

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

关于design-patterns - 工厂、抽象工厂和工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2079902/

相关文章:

java - 分离数据模型和图形用户界面表示的设计模式

oop - 每个公共(public)方法都被接口(interface)覆盖是一个好的做法吗?

scala - 伴随对象作为scala中的工厂

C++ 在运行时从编译时已知集/枚举中选择模板非类型参数

c# - build 更好的工厂

ruby - 有没有一种 Ruby 方法可以删除初始化程序中的样板代码?

python - 带有 tkinter 的嵌套类工厂

unit-testing - 从 MbUnit 迁移到 MsTest 时的问题

c++ - 工厂方法和循环依赖

java - 适用的设计模式