Builer模式的意图是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builer模式和Abstract Factory模式很像,但是他们关注的侧重点不同,Abstract Factory模式是要解决产品族与产品系列之间的关系。比如我们要生产汽车还是火车,Abstract Factory模式直接返回这个产品。Builer模式关注的是产品的创建过程,比如我们在创建汽车的过程中调用汽车的设置轮子的方法,把这个轮子设置为火车的轮子也是可以的。
对比我们迷宫的例子就是:如果传递一个对象给CreateMaze,这个对象可以在它所建造的迷宫中使用增加房间、墙壁和门的操作,来全面创建一个新的迷宫,那么你可以使用继承来改变迷宫的一些部分或该迷宫被建造的方式。这是Builder模式的一个例子。
Builer模式的结构如下图:
• Builder
— 为创建一个Product对象的各个部件指定抽象接口。
• ConcreteBuilder
— 实现Builder的接口以构造和装配该产品的各个部件。
— 定义并明确它所创建的表示。
— 提供一个检索产品的接口
• Director
— 构造一个使用Builder接口的对象。
• Product
— 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
— 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
适用性:
在以下情况使用Builder模式
• 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
• 当构造过程必须允许被构造的对象有不同的表示时。
在Abstract Factory模式中我们有一个MazeFactory类来作为不同类型迷宫的基类
在这里我们创建一个类似的基类MazeBuilder
我们来看Abstract Factory模式中CreateMaze函数
我们看到Abstract Factory模式直接返回产品
我们来看Builer模式中的CreateMaze函数
Builer模式中还需调用builder.GetMaze()函数才能返回产品。
这个例子在设计模式中不太好理解,简单说Abstract Factory模式会返回一个系列的产品,这是个完整的产品;Builer模式重在一步一步的构建产品。
这里顺便引用下《大话设计模式》一书中的相应例子,那个例子中要求小人不能缺胳膊少腿,但从上文中我们可以看出,Builder模式其实是可以造出断臂维纳斯的: