概念解析
构建模式,指的是将复杂对象的构建过程和它的表现分离,使得不同的构建过程可以获取(创建)不同的表现。构建模式的三个主要角色:
- 产品(Product):要构建的对象
 - 构建者(Builder):构建模式的核心类,负责产品的构建过程
 - 指挥者(BuilderManager):构建的管理类,负责管理每一种产品的创建数量和创建顺序
 
构建模式类图如下:

构建模式的优点在于:
- 将产品的创建过程与产品本身分离,让使用方(调用者)可以用不同的创建过程创建不同的产品/对象
 - 将对象的创建过程分离出来,精确控制复杂对象的创建
 - BuilderManager为构建模式的升级版,使得每一个具体的构建者都相对独立,可以方便地替换构建者或者增加新的构建者
 
其缺点在于:
- 增加很多创建类,产品越多,类越多,整个系统也会变得更复杂
 - 铲平之间结构相差过大,构建模式会比较难适应
 
使用的一些场景:
- 产品的创建过程比较复杂,需要独立产品的创建过程
 - 产品有很多种类,每个种类之间的内部结构比较类似,但是存在一定差异。
 
设计模板
代码设计模板如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from abc import ABCMeta, abstractmethod
class Toy(metaclass=ABCMeta):
    """玩具"""
    def __init__(self, name):
        self._name = name
        self.__components = []
    def get_name(self):
        return self._name
    def add_component(self, component, count=1, unit="个"):
        self.__components.append([component, count, unit])
    @abstractmethod
    def feature(self):
        pass
    class Car(Toy):
        """小车"""
        def feature(self):
            print("我是%s,我可以快速奔跑..." % self._name)
    class Manor(Toy):
        """庄园"""
        def feature(self):
            print("我是%s,我可供观赏,也可用来游玩!" % self._name)
class ToyBuilder(metaclass=ABCMeta):
    """玩具构建者"""
    @abstractmethod
    def build_product(self):
        pass
class CarBuilder(ToyBuilder):
    """车的构建类"""
    def build_product(self):
        car = Car("迷你小车")
        print("正在构建 %s..." % car.get_name())
        car.add_component("轮子", 4)
        car.add_component("车身", 1)
        car.add_component("发动机", 1)
        car.add_component("方向盘")
        return car
class ManorBuilder(ToyBuilder):
    """庄园的构建类"""
    def build_product(self):
        manor = Manor("海淘小庄园")
        print("正在构建 %s..." % manor.get_name())
        car.add_component("客厅", 1, "间")
        car.add_component("卧室", 2, "间")
        car.add_component("书房", 1, "间")
        car.add_component("厨房", 1, "间")
        car.add_component("花园", 1, "个")
        car.add_component("围墙", 1, "堵")
        return manor
class BuilderMgr():
    """构建类的管理者"""
    def __init__(self):
        self.__car_builder = CarBuilder()
        self.__mano_builder = ManorBuilder()
    def build_car(self, num):
        count = 0
        products = []
        while count < num:
            car = self.__car_builder.build_product()
            products.append(car)
            count += 1
            print("构建完成第 %d 辆 %s" % (count, cat.get_name()))
        return products
    def build_manor(self, num):
        count = 0
        products = []
        while count < num:
            car = self.__manor_builder.build_product()
            products.append(car)
            count += 1
            print("构建完成第 %d 辆 %s" % (count, cat.get_name()))
        return products
def test_advance_builder():
    builder_mgr = BuilderMgr()
    builder_mgr.build_manor(2)
    builder_mgr.builder_car(4)
    """
    输出结果:
    正在构建 淘淘小庄园...
    建造完成第1个 淘淘小庄园
    正在构建 淘淘小庄园...
    建造完成第2个 淘淘小庄园
    正在构建 迷你小车...
    建造完成第1辆 迷你小车
    正在构建 迷你小车...
    建造完成第2辆 迷你小车
    正在构建 迷你小车...
    建造完成第3辆 迷你小车
    正在构建 迷你小车...
    建造完成第4辆 迷你小车
    """