Xiao Peng

My personal blog moves to xiaopeng.me , blogs about design patterns will be synced to here.
肖鹏,ThoughtWorks资深咨询师,目前关注于架构模式、敏捷软件开发等领域,并致力于软件开发最佳实践的推广和应用。
多次为国内大型企业敏捷组织转型提供咨询和培训服务,在大型团队持续集成方面具有丰富的经验。
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

没有Factory这个模式(更新于2007年1月27日)

Posted on 2006-12-03 16:14  勇敢的鸵鸟  阅读(2422)  评论(19编辑  收藏  举报

一.引子

GOF的23个模式中与Factory相关的有两个,一个是Factory Method,另一个是Abstract Factory模式。还有一个是Simple Factory,是深入浅出设计模式这本书定义的。这里面没有Factory这个模式,很多人都没有注意到这一点(包括idior,谁让你有名呢:)。

*如果您对创建型模式特别是Factory MethodAbstract FactorySimple Factory还没有初步了解,建议你先看看博客园设计模式团队相关的文章。

二.讨论

提出这一点来绝对不是哗众取宠,关键是这个“Method”很重要。我们先来看看GOF的书中关于Factory Method的类图结构:

Idior说很多人没有注意到AnOperation这个方法,也许是这样的,但是这个方法并不重要。工厂方法的意图一节中指出:工厂方法定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。其别名是虚拟构造器。从其意图和别名中都看不出AnOperation这个方法。当然为了说明这个方法不重要,我还必须给出一个例子:该例子使用了Factory Method模式,而又不存在AnOperation方法。有吗?有,就是Abstract Factory模式。

《DP》中在说到Abstract Factory模式的实现的时候,指出AbstractFactory仅声明一个创建产品的接口,真正创建产品是由ConcreteProduct子类实现的。最通常的办法是为每一个产品定义一个工厂方法(参见Factory Method(3.3))。一个具体的工厂将为每个产品重定义该工厂方法以指定产品。从这里我们可以看出来:Factory Method和Abstract Factory不是一个层次上的模式。前者是实现后者的一些有用技术之一。(《DP》中的说法是:Here are some useful techniques for implementing the Abstract Factory pattern.)GOF也多次强调,自己给出的类图只是一个例子,一种实现(我找到原话再贴过来:)。所以我们不应该拘泥于《DP》中的类图。

在新手中,一个常见的误解是Factory Method应该有一个独立的Factory类。这是新手才会犯的错误,Factory Method,只是一个Method而已。任何时候,当你存在一个虚拟的(抽象的)函数其返回值是一个接口(抽象类),你就在使用Factory Method了。我们不关心谁调用这个方法,这个方法的参数如何。理解一个模式的简单性往往比理解其复杂性更重要。

那么Factory Method是不是可以有一个独立的Factory类与其对应呢?当然可以,而且恭喜你,如果你的独立的Factory类中包含几个Factory Method,你已经在使用Abstract Factory了。注意不要跟Simple Factory模式弄混,Simple Factory虽然也包含创建对象的方法,但是并没有使用Factory Method模式。

我们再来看看Abstract Factory的类图: 

 

在这个类图中CreateProductA()和CreateProductB()都是Factory Method(而没有出现AnOperation()这样的方法)。

三.结论:

虽然这篇随笔已经很短了,我仍然愿意总结一下前面所说的话,以节省您的时间:)

1. 没有Factory这个模式,大多数人提到Factory模式的时候,实际上指的是Factory Method。

2. Factory Method模式不要求一个独立的工厂类,该模式的核心是一个虚拟的(抽象的)方法,该方法返回一个产品的接口。

3. Factory Method和Abstract Factory不是一个层次上的模式,前者是后者赖以实现的一项技术,后者可以从前者演化而来。关于演化过程请参考idior的这篇文章

四.并非闲话

不记得是idior,TerryLee或者吕兄中的哪一位提出的“纯”的设计模式这个说法,指的是最简单的而符合某个模式的定义的实现。我们见到的设计模式的实现往往是或与其他模式混合使用,或者对具体应用做了妥协,使得我们看不到“纯”的设计模式,也就看不到模式的简单性。而理解模式的简单性对于我们认识模式的实质是非常重要的,就像是在化学里面分析原子的特性一样。

五.何谓Factory(From《重构与模式》)

Factory一词是业内滥用最厉害和最不精确的术语之一。有些人使用“Factory模式”一词指代Factory Method[DP]模式,有些人使用这个术语表示Abstract Factory[DP]模式,有些人使用这个术语表示这两个模式,而有些人则使用这个词表示任何创建对象的代码。

......

下图中使用粗线表示创建对象的方法,说明了Factory Method,Factory(书中所指的Factory,笔者注)和Abstract Factory结构之间的区别。