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

Posted

技术标签:

【中文标题】工厂、抽象工厂和工厂方法【英文标题】:Factory, Abstract Factory and Factory Method 【发布时间】:2011-01-05 23:58:28 【问题描述】:

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

我的理解是:

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

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

是吗?

还有哪些不同之处?

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

【问题讨论】:

***.com/questions/1001767/… 的重复项? 【参考方案1】:

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

工厂方法

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

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

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

抽象工厂

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

典型的直接出书示例是 Widget Factory;回到 GoF 发布的那一天,跨平台 GUI 开发有点麻烦,所以你可以定义一个抽象的小部件工厂类。

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

附录 - 混凝土工厂

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

因此,当我编写自己的 document 泛化覆盖 createElement 时,我创建的类是混凝土工厂。

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

【讨论】:

具体工厂也称为静态工厂。对象创建方法作为静态方法。【参考方案2】:

最好的学习方式肯定是阅读。 看看这个:http://www.dofactory.com/Patterns/Patterns.aspx。

工厂方法将对象的创建推迟到子类。这意味着定义了基类/接口,但是客户端代码不会针对该接口创建对象。实现接口的子类被留下来初始化一个对象。

抽象工厂可以在这里找到:http://www.dofactory.com/Patterns/PatternAbstract.aspx#_self2

该网站上已经有很好的信息。下一个最好的事情是检查 wiki:

http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29

http://javadesign-patterns.blogspot.com/ 是学习设计模式的好地方

【讨论】:

【参考方案3】:

工厂模式:返回一个系列的对象 ABSTRACT FACTORY:返回多个家族的对象。

所以你可能会说抽象工厂包含多个工厂

【讨论】:

以上是关于工厂、抽象工厂和工厂方法的主要内容,如果未能解决你的问题,请参考以下文章

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

设计模式系列-Builder模式,工厂方法模式和抽象工厂模式

java抽象工厂的使用意图是啥?

设计模式——抽象工厂,简单工厂和工厂方法

设计模式--10工厂方法和抽象工厂模式

Java设计模式-工厂方法模式和抽象工厂模式