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

sky*_*oor 42 design-patterns factory factory-pattern abstract-factory

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

我的理解是:

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

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

是对的吗?

还有什么区别?

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

Ric*_*uen 39

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

工厂方法

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

var newDiv = document.createElement('div');
Run Code Online (Sandbox Code Playgroud)

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

抽象工厂

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

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

这个类可以有方法createWindow,createButton,createScrollBar等.反过来,几种实现将被定义为产生Swing小部件或AWT或什么的.然后,根据配置,将实例化不同的类.

附录 - 混凝土工厂

我相信Concrete Factory是Abstract Factory或Factory方法的任何非抽象实现.

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

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