目录
[显示]

1.摘要

Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。初识Builder模式或许会觉得很简单,但是很多人仅仅是把Builder模式当作拆分了的Factory Method模式使用,这是违背Builder模式本意的。

2. 针对问题

已知用Factory模式可以方便的创建一类或一组对象。但如果要创建一个由几部分组合而成或需要分布创建的复杂对象,并且复杂对象中包含其他对象的具体类型不确定或创建步骤不确定时,Factory模式就难以适应这种需求了。
一个简单的例子是方便面:泡面一般是开盖-倒水-等3分钟-加料这个顺序下,根据实际泡的东西不同,最终结果可以是泡好的方便面,也可以是方便泡饭,还可以是泡馍。而加料这个步骤可以在倒水前,也可以在倒水后(当然也可以不加)。这就类似于Builder模式的工作原理。

3. 介绍

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

4. 实现

Builder模式分为两个部分:Builder和Director。
Builder:为创建对象各个部件提供相应接口,并提供返回对象的接口。
Director:封装使用Builder构造对象的逻辑。
Builder模式的结构如下图:
Builder模式

使用Builder模式时的流程如下:

由上图可以看出,Builder模式与Factory模式的最大区别在于创建后的对象存在于Builder中,也就是说组件的构造与拼装逻辑是分开的。Director仅仅知道构造过程,但并不知道实际构造出的是什么。这也是Builder模式不同于Factory模式的特征之一。

5. 关于Director的实现

从上面的讨论可以看出,一个Director可以对应多种Builder,并使用同一种构造过程创建不同的对象。假如了解至此,那么Builder模式更像是拆开了的Factory Method,仅仅是把一个函数拆成了几个函数并用了另一个函数返回而已。那么也就产生了一个问题:Director的作用是什么?是否可以让一个Builder对应多个Director,并使用不同的构建过程创造同一种对象呢?
《设计模式》书中对于这种情况的描述为:“每个Builder包含了创建和装配一个特定产品的所有代码。这些代码只需书写一次;然后不同的Director可以复用它以在相同不见集合的基础上构作不同的Product。”,也就是说这种思路也是应该被考虑到的。
因为书中没有进一步讨论这种方式,所以只能靠自己补完了。静态图如下:

活动图如下:

可以看到,我为Director增加派生类之外还增加了setBuilder接口。虽然client必须了解具体Builder所产生的对象类型,但是对于Director可以只了解接口而不必关注具体实现,所以创建Director实例并不必须由Client完成,这里的Director实际上更像是使用了策略模式。一些Director的例子并没有使用继承,而是使用了if/switch等方式,实质上思想是一样的。
所以,Builder最终是实现构建过程构建表示的解耦,这两者结合才是Builder模式的精髓。

6. 特点

1、构建过程构建表示分离,Director控制构建的顺序与组件数量,Builder包含构建具体组件的逻辑及最终产品的类型。
2、Builder的最终产品并不一定是相同的类型,也就是说,getResult的返回值是可以在Builder派生类中定义的。

7. 相关文章

设计模式总结

8. 参考文章

  1. 《设计模式_可复用面向对象软件的基础》
  2. http://www.cnblogs.com/happyhippy/archive/2010/09/01/1814287.html