工厂,抽象工厂和工厂方法

时间:2010-01-17 03:58:51

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

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

我的理解是:

    工厂模式中的
  • ,没有混凝土工厂。工厂根据参数构建新对象。

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

是吗?

其他差异是什么?

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

3 个答案:

答案 0 :(得分:39)

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

工厂方法

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

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

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

抽象工厂

抽象工厂旨在“提供用于创建相关或依赖对象族的接口,而无需指定具体类。

典型的直言不讳的例子是Widget Factory;在GoF发布的那一天,跨平台的GUI开发有点麻烦,所以你可以定义一个抽象的widget工厂类。

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

附录 - 混凝土工厂

我认为Concrete Factory是Abstract Factory或Factory方法的任何非抽象实现。

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

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

答案 1 :(得分: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/是学习设计模式的好地方

答案 2 :(得分:4)

FACTORY PATTERN:返回一个家庭的对象
摘要工厂:返回多个家庭的对象。

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