抽象工厂模式作为工厂模式的一种,自然具有工厂模式的设计理念,也就是提供一种生产实际产品的方法。
builder模式的设计思想是提供一种组装产品零件的方法。
二者乍看起来井水不犯河水,可仔细一看二者何其相似来耳。
在抽象工厂方法中有产品族的概念,意指同一系列的产品。比如魔兽中的一个族就有一套这样的单位,而不同族之间都含有类似的单位,而各自对应的单位又具有一些差异。这样在抽象工厂方法中建立4个具体工厂,各自负责一个族的单位生产就很自然了。
作为对比,举一个builder的例子。我们攒机器的时候首先会想到选用什么样的CPU、显卡,然后是什么样的主板,继而选择什么样的内存、硬盘。这样我们在攒机器前就应该有一个所谓的指导类,向这个指导类中传入具体的builder类就可以组装出符合我们要求的机器。
也许你发现了二者的差别,抽象工厂中必须要有严格的界限,即是你的就不是我的;而builder模式不存在这样一个限制,你没有被要求选择AMD就要选择金士顿。在我看来,若只看表明确实如此,如果深究这并非什么二者的差别。builder模式的无限制也可以扩展到抽象工厂中去。
抽象工厂中某个产品等级结构(我觉得叫做产品种类更为合适)就要在每一个产品族中有一个具体的产品,比如农民就有侍僧、小精灵、苦力、农民四种,其它单位也基本如此。然而是可以有特例的,英雄就是一个特例。四个族中虽然含有各自的英雄,但是雇佣英雄的出现打破了这种限制,它们不属于任何一个族,却又属于所有的族。这样二者这方面的差别并不是本质上的。
那么本质上的差别是什么呢?
其实很简单,本质上的差别还是源于设计理念。抽象工厂被设计出来的原因是生产一系列产品的需要,builder模式被设计出来的原因是组装一系列的组件生产出一件产品。builder模式最终的目标是返回一件成品,而抽象工厂所返回的是一系列相互关联的产品。
builder模式可以利用抽象工厂方法生产自己的组件,而抽象工厂方法如果将所有生产的产品组装在一起也就成为了builder模式。
![](http://www.cnblogs.com/images/cnblogs_com/floodpeak/chinaHeart.jpg)