10.12 构建器模式:创建复杂对象

构建器(Builder)(它和前面已经讨论过的工厂方法一样,属于创建型模式)模式的目标是将对象的创建与它的“表示法”(representation)分开。这就意味着,创建过程保持原状,但是产生对象的表示法可能不同。“四人帮”指出,构建器模式和抽象工厂模式主要的区别就是,构建器模式一步步创建对象,所以及时展开输出创建过程就似乎很重要。此外,“主管(director)”获得一个切片的流(stream),并且将这些切片传递给构建器,每个切片用来执行创建过程中的一步。

下面有一个例子,作为模型的一辆自行车按照其类型(山地车、旅行车或赛车)来选择零部件组装一辆自行车。一个构建器与每个自行车类都关联,每个构建器实现的接口由抽象类BicycleBuilder中指定。单独的类BicycleTechnician表示“四人帮”中描述的“导向器”对象,它使用具体的BicycleBuilder对象来构造Bicycle对象。

10.12 构建器模式:创建复杂对象 - 图1

10.12 构建器模式:创建复杂对象 - 图2

10.12 构建器模式:创建复杂对象 - 图3

Bicycle持有一个vector,用于保存指向BicyclePart对象的指针,这些对象表示用于构造自行车的部件。由一个BicycleTechnician(本例中的“主管”)调用派生的BicycleBuilder对象的函数BicycleBuilder:createproduct()来初始化一辆自行车的创建。BicycleTechnician:construct()函数调用BicycleBuilder接口中的所有函数(因为它不知道有什么具体的构建器类型)。具体的构建器类省略了(通过空函数体)那些与他们所构建的自行车的类型无关的动作,如下面的实现文件所示:

10.12 构建器模式:创建复杂对象 - 图4

10.12 构建器模式:创建复杂对象 - 图5

10.12 构建器模式:创建复杂对象 - 图6

Bicycle流插入符为各个BicyclePart调用相应的插入符,并且打印其类型名称以便知道Bicycle对象包含的内容。程序举例如下:

10.12 构建器模式:创建复杂对象 - 图7

10.12 构建器模式:创建复杂对象 - 图8

这种模式的功能就是它将部件组合成为一个完整产品的算法与部件本身分开,这样就允许通过一个共同接口的不同实现来为不同的产品提供不同的算法。