工厂,抽象工厂和工厂方法
我对这三个术语非常困惑。
我的理解是:
-
在工厂模式中,没有具体的工厂。 工厂根据参数build立新的对象。
-
在抽象工厂模式中,有多个具体的工厂。 客户必须明确地创build不同的混凝土工厂。
是对的吗?
其他的区别是什么?
此外,什么是工厂方法模式? 与工厂模式相同吗?
四人帮“devise模式;可重用面向对象软件的元素”一书包含两个条目,即“抽象工厂”(又名'虚拟build设者')和“工厂方法”…我不知道“混凝土工厂”。 我听说过这个词,但从未给过多的考虑。
工厂方法
在“工厂方法”中,一个对象有一个负责实例化另一个对象的方法。 一个常见的例子是JavaScript文档对象和HtmlElement
对象的创build:
var newDiv = document.createElement('div');
这不是一个很好的例子,作为工厂方法的重要组成部分是多态性。 如果我可以扩展document
来定义另一个定义另一个createElement
类,这将是主要的Factory Method材质。
抽象工厂
抽象工厂的目的是“提供一个接口来创build相关或依赖对象的族,而不指定具体的类。
典型的直销例子是Widget Factory, 在GoF发布的那一天,跨平台的GUI开发有点麻烦,所以你可以定义一个抽象的Widget工厂类。
该类可以有createWindow
, createButton
, createScrollBar
等方法。反过来,几个实现将被定义为产生Swing小部件或AWT或其他。 然后,根据configuration,不同的类将被实例化。
附录 – 混凝土厂
我相信一个具体工厂是抽象工厂或工厂方法的非抽象实现。
所以,当我自己写一个覆盖createElement
的document
,我创build的类就是一个Concrete Factory。
同样,虽然WidgetFactory
将是一个抽象工厂,但SwingWidgetFactory
将是一个具体的工厂。
最好的学习方法是明确的阅读。 看看这个: http : //www.dofactory.com/Patterns/Patterns.aspx 。
工厂方法推迟创build对象到子类。 这意味着定义了一个基类/接口,但客户端代码不会根据此接口创build一个对象。 实现接口的子类被留下来初始化一个对象。
抽象工厂可以在这里find: http : //www.dofactory.com/Patterns/PatternAbstract.aspx#_self2
该网站上已经有很好的信息。 下一个最好的事情是检查维基:
http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29
工厂模式:返回一个家庭的对象
抽象工厂:返回多个家庭的对象。
所以你可以说抽象工厂包含多个工厂