授课语音

建造者模式

1. 介绍

建造者模式是一种设计模式,用于构建复杂对象的各个部分,而无需指定该对象的具体类。它通过逐步创建对象的各个部分,并利用建造者对象将这些部分组装成最终产品。这种模式特别适用于需要创建复杂对象的场景,尤其是在对象的创建过程涉及多个步骤,或者对象的不同部分可以独立变化时。

主要角色

  1. 产品(Product): 最终构建的复杂对象,包含各种组成部分。
  2. 抽象建造者(Builder): 定义创建产品的步骤和方法,但不负责具体的组合。
  3. 具体建造者(Concrete Builder): 继承自抽象建造者,实现具体步骤,负责实际创建产品的部分。
  4. 指挥者(Director): 管理建造过程,调用建造者的方法以确保产品按顺序构建。
  5. 客户端(Client): 使用指挥者来获取最终产品,无需了解构建过程的细节。

应用场景

  1. 复杂对象构建: 构建需要多个步骤的复杂对象时,建造者模式非常适用。
  2. 步骤独立性: 每个步骤可能需要不同设置时,建造者模式能有效组织这些步骤。
  3. 组件独立变化: 当对象的不同部分可以独立变化时,简化对象的创建过程。
  4. 重用构建过程: 在多个地方重复使用对象的创建过程时,封装和复用逻辑。
  5. 复杂算法: 构建过程涉及复杂逻辑时,封装在具体建造者中,客户端可以简单获取产品。

优点

  1. 分离创建与表示: 提高代码灵活性和可维护性。
  2. 增加灵活性: 通过不同的建造者配置不同产品特性。
  3. 避免参数爆炸: 使代码清晰易懂。
  4. 更好的封装: 客户端专注于最终产品,无需了解创建细节。

缺点

  1. 增加复杂性: 引入多个角色可能增加系统复杂性。
  2. 多个建造者: 对于每种产品类型,可能需要定义多个具体建造者,增加代码量。

2. 代码案例

# =================== 建造者模式 ===================
"""
1. 产品类(Car):
    - engine: 发动机类型,例如 "V8 发动机"。
    - transmission: 变速器类型,例如 "6速手动"。
    - wheels: 车轮类型,例如 "运动轮胎"。
    - color: 颜色,例如 "红色"。
    - is_sunroof: 是否有天窗(True 或 False)。
    - Car.Builder 是一个内部类,用于逐步构建 Car 对象,支持链式调用的方法。

2. 抽象建造者(CarBuilder):
    - 定义了构建汽车的各个步骤方法,但实际实现由具体建造者类提供。
    - 每个方法返回 self 以支持链式调用。

3. 具体建造者(SportsCarBuilder):
    - 实现了 CarBuilder 接口,具体化了各个构建步骤,并返回 self 以实现链式调用。
    - 使用 Car.Builder 来创建和设置 Car 对象的属性。

4. 指挥者(CarDirector):
    - 使用具体建造者来构建汽车,按照指定顺序调用构建步骤方法。
    - 最终通过 get_result 方法获取构建好的 Car 对象。

5. 客户端(main 函数):
    - 演示了如何通过指挥者模式来构建汽车。
    - 还展示了如何直接使用建造者对象,通过链式调用构建自定义的汽车,并输出结果。
"""

# =================== 产品类(Product) ===================
class Car:
    """
    汽车类,作为建造者模式中的产品类。
    包含多个属性,代表汽车的不同特性。
    """

    def __init__(self):
        self.engine = None  # 发动机类型
        self.transmission = None  # 变速器类型
        self.wheels = None  # 车轮类型
        self.color = None  # 颜色
        self.is_sunroof = False  # 是否有天窗

    def __str__(self):
        return (f"汽车 [发动机={self.engine}, 变速器={self.transmission}, "
                f"车轮={self.wheels}, 颜色={self.color}, 天窗={self.is_sunroof}]")

    class Builder:
        """
        Builder 类用于逐步构建 Car 对象。
        """

        def __init__(self):
            self.car = Car()

        def set_engine(self, engine):
            self.car.engine = engine
            return self

        def set_transmission(self, transmission):
            self.car.transmission = transmission
            return self

        def set_wheels(self, wheels):
            self.car.wheels = wheels
            return self

        def set_color(self, color):
            self.car.color = color
            return self

        def set_sunroof(self, is_sunroof):
            self.car.is_sunroof = is_sunroof
            return self

        def build(self):
            return self.car


# =================== 抽象建造者(Builder) ===================

class CarBuilder:
    """
    汽车建造者接口,定义了构建汽车的各个步骤。
    """

    def build_engine(self):
        raise NotImplementedError

    def build_transmission(self):
        raise NotImplementedError

    def build_wheels(self):
        raise NotImplementedError

    def build_color(self):
        raise NotImplementedError

    def build_sunroof(self):
        raise NotImplementedError

    def get_result(self):
        raise NotImplementedError


# =================== 具体建造者(Concrete Builder) ===================

class SportsCarBuilder(CarBuilder):
    """
    具体建造者,实现了 CarBuilder 接口,用于构建一辆特定类型的汽车。
    """

    def __init__(self):
        self.builder = Car.Builder()

    def build_engine(self):
        self.builder.set_engine("V8 发动机")
        return self

    def build_transmission(self):
        self.builder.set_transmission("6速手动")
        return self

    def build_wheels(self):
        self.builder.set_wheels("运动轮胎")
        return self

    def build_color(self):
        self.builder.set_color("红色")
        return self

    def build_sunroof(self):
        self.builder.set_sunroof(True)
        return self

    def get_result(self):
        return self.builder.build()


# =================== 指挥者(Director) ===================

class CarDirector:
    """
    指挥者类,负责安排和管理汽车的建造过程。
    """

    def __init__(self, builder):
        self.builder = builder

    def construct(self):
        self.builder.build_engine() \
            .build_transmission() \
            .build_wheels() \
            .build_color() \
            .build_sunroof()
        return self.builder.get_result()


# =================== 客户端(Client) ===================

def main():
    # 创建具体建造者
    builder = SportsCarBuilder()

    # 创建指挥者并传入建造者
    director = CarDirector(builder)

    # 使用指挥者构建汽车
    car = director.construct()

    # 输出构建的汽车
    print(car)

    # 直接使用建造者链式调用构建汽车
    custom_car = builder.build_engine() \
        .build_transmission() \
        .build_wheels() \
        .build_color() \
        .build_sunroof() \
        .get_result()
    print(custom_car)


if __name__ == "__main__":
    main()

代码详解

  1. 产品类(Car): 定义汽车的各个属性,并实现一个内部类 Builder 来支持逐步构建。
  2. 抽象建造者(CarBuilder): 定义构建汽车的各个步骤,具体实现由 Concrete Builder 提供。
  3. 具体建造者(SportsCarBuilder): 实现了具体的构建步骤,返回 self 以支持链式调用。
  4. 指挥者(CarDirector): 管理构建过程,确保各步骤按顺序执行。
  5. 客户端(main 函数): 演示如何通过指挥者和直接使用建造者来创建汽车,并输出结果。

图示

Image___1397757895815441036===3ec0f03448b67b89573926640c0bce2e===4_1.png___

去1:1私密咨询

系列课程: