Factory Method vs Abstract Factory

点开这篇着你已经大致对工厂方法有了一定的了解。但为什么依然对这两者的区别不是很明白,在搜索了一天、看了许多文章后我有了一点想法,在这里分享并记录一下。

引用SO的一段文字:

One difference between the two is that with the Abstract Factory pattern, a class delegates the responsibility of object instantiation to another object via composition whereas the Factory Method pattern uses inheritance and relies on a subclass to handle the desired object instantiation.

这是说,Factory Method采用继承的方式,将创建产品推迟到子类;而Factory Abstract采用组合的方式,将一系列相关的产品组合到一起。

其实抽象工厂中的每一个创建产品的接口都是一个工厂方法,只不过工厂方法创建一个产品,而抽象工厂创建一系列产品

有个例子觉得非常简单又能说明问题:Shape。


假设现在有Circle和Rectangle两种Shape,而Client代码需要根据情况创建一个具体的Shape。

Factory Method:

Factory Method vs Abstract Factory_第1张图片

工厂方法由接口IShapeFactory中的CreateShape提供,方法创建一个Shape,但至于具体返回怎样的Shape,是由子类来完成的。对于CircleFactory,它实现工厂方法并返回一个Circle对象,RectangleFactory工厂则返回一个Rectangle对象。

好了,现在Client代码想要一个Circle对象,则它不用自己出马,请具体的工厂来代工。

IShapeFactory shapeFactory = new CircleFactory()//创建一个可以生产Circle的工厂
Shape shape = shapeFactory.CreateShape();//Circle工厂负责创建一个Circle产品
//Now, client could use this 'Circle' shape happily...

现在,你希望创建一个带有颜色的Shape,比如RedCircle、GreenRectangle等等组合。在你手上有许多Shape,也买好了许多颜料,你希望工厂能够为你生产五颜六色的产品。依靠工厂模式的思想,将具体类的实例化与客户代码分离,由工厂负责生产具体的产品。

RedCircle产品 = Circle产品 + Red产品

每个工厂实际上要将有关系的产品组合在一起,为你创建出一个完整的产品。我想这就是为什么SO那段引用里说“抽象工厂模式利用组合”的原因吧。

Abstract Factory:

Factory Method vs Abstract Factory_第2张图片

这张图看起来复杂,其实很简单不要慌张。

与Factory Method不同的是,Abstract Factory只是能够生产一系列产品而已。它的做法无非是将相关的产品放在一起,由工厂一个个地来生产它们。你很聪明,其实抽象工厂里隐含着工厂方法的影子!一个个地CreateXXX其实就是工厂方法嘛。

你想要一个绿色的矩形:

IColorfulShapeFactory greenRectangleFactory = new GreenRectangleFactory();//请绿色矩形工厂来生产
ColorfulShape colorfulShape = new ColorfulShape(greenRectangleFactory);//使用绿色矩形工厂生产的产品来实例化一个具体的GreenRectangle
//Now, 你可以为所欲为了...

与Factory Method略有不同的是,由于Abstract Factory生产一组产品,而你要的是一个完整的产品(它由这一组子产品构成),因此在ColorfulShape中,我们把工厂生产的产品用来初始化,这样就构成了一个完整的产品。


Conclusion:

1. Factory Method 生产一个产品;Abstract Factory 生产一组产品;

2. 在 Factory Method 中,每一个CreateXXX方法实际上都是一个Factory Method ;

3. 当需要扩展一个产品时,对于工厂方法来说只需要再实现一个生产这个产品的工厂就可以了,而对于抽象工厂来讲,因为最终的产品是由许多子产品组合而成的,因此就显得麻烦了多:

    还是以ColorfulShape产品为例。

  a. 改动发生在原子产品上,如增加一个蓝色,那只需要实现几个能够生产BlueShape的工厂;

  b. 改动发生在新子产品上,如你又想为ColorfulShape增加一个特性-----夹心材料(假设你在生产一款五颜六色、形状各异的夹心糖果,p.s.我实在想不来加什么属性好了。。),那就需要更改抽象工厂的接口,并牵连至所有实现了该接口的具体工厂!

    可以看到,不论如何改动都比Factory Method来的大。

=====

以上是个人的一些理解,希望在没有误导你的前提下,对你能够有些帮助。不妥之处还恳请指出。



你可能感兴趣的:(Head,First,Design,Pattern)