概念解析
构建模式,指的是将复杂对象的构建过程和它的表现分离,使得不同的构建过程可以获取(创建)不同的表现。构建模式的三个主要角色:
- 产品(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辆 迷你小车
"""