Posts 设计模式-构建模式
Post
Cancel

设计模式-构建模式

概念解析

构建模式,指的是将复杂对象的构建过程和它的表现分离,使得不同的构建过程可以获取(创建)不同的表现。构建模式的三个主要角色:

  • 产品(Product):要构建的对象
  • 构建者(Builder):构建模式的核心类,负责产品的构建过程
  • 指挥者(BuilderManager):构建的管理类,负责管理每一种产品的创建数量和创建顺序

构建模式类图如下:

img

构建模式的优点在于:

  • 将产品的创建过程与产品本身分离,让使用方(调用者)可以用不同的创建过程创建不同的产品/对象
  • 将对象的创建过程分离出来,精确控制复杂对象的创建
  • 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辆 迷你小车
    """

实例分析

This post is licensed under CC BY 4.0 by the author.

设计模式-装饰模式

设计模式-组合模式