设计模式--创建模式-建造者模式
已于 2025年01月14日 15:31 修改
访问次数:15
建造者模式(Builder Pattern)
建造者模式(Builder Pattern)是一种创建型设计模式,旨在将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。简而言之,建造者模式通过分步构建来创建复杂对象,它可以更好地控制复杂对象的创建过程,同时保持代码的可读性和可维护性。
1. 意图
建造者模式的目的是解耦对象的构建过程与对象的表示。它将复杂对象的构建过程分为多个步骤,每个步骤创建对象的一部分,最终将这些部分组合成一个完整的对象。
2. 结构
建造者模式通常包括以下几个角色:
- Product(产品):表示要构建的复杂对象。
- Builder(建造者):声明了构建产品各个部分的抽象方法。
- ConcreteBuilder(具体建造者):实现了构建产品各个部分的具体方法,并定义了如何将这些部分组装成最终产品。
- Director(指挥者):负责构建一个使用
Builder的对象,通常它会根据具体的需求来决定构建过程的顺序。 - Client(客户端):通过使用
Director来构建产品,客户端不直接操作建造过程。
3. UML 类图
+-------------------------+
| Director |
+-------------------------+
| +construct() |
+-------------------------+
|
v
+------------------+ +----------------------+
| Builder |<>---->| Product |
+------------------+ +----------------------+
| +buildPart1() | | -part1 |
| +buildPart2() | | -part2 |
| +getResult() | | -part3 |
+------------------+ +----------------------+
^
|
+----------------------------+
| ConcreteBuilder |
+----------------------------+
| +buildPart1() |
| +buildPart2() |
| +getResult() |
+----------------------------+
4. 实现步骤
- 产品类(Product):构建复杂对象的最终产品,它由多个部件组成,每个部件可以通过建造者的不同实现来创建。
- 抽象建造者(Builder):定义创建产品各个部件的方法,包括初始化和构建各个部件的抽象方法。
- 具体建造者(ConcreteBuilder):实现抽象建造者中的方法,负责实现具体部件的创建并最终返回完整的产品。
- 指挥者(Director):负责管理建造过程,指定建造的顺序和构建哪些部件。
- 客户端(Client):通过指挥者来完成产品的构建过程,客户端只需要获取产品,不需要关心具体的构建过程。
5. 示例:构建一台电脑
假设我们要建造一台电脑,电脑有多个部件:处理器(CPU)、内存(RAM)、硬盘(Hard Drive)等。
5.1 定义产品(Product)
class Computer:
def __init__(self, cpu, ram, hdd):
self.cpu = cpu
self.ram = ram
self.hdd = hdd
def __str__(self):
return f"Computer with CPU: {self.cpu}, RAM: {self.ram}, HDD: {self.hdd}"
5.2 定义抽象建造者(Builder)
from abc import ABCMeta, abstractmethod
class ComputerBuilder(metaclass=ABCMeta):
@abstractmethod
def build_cpu(self):
pass
@abstractmethod
def build_ram(self):
pass
@abstractmethod
def build_hdd(self):
pass
@abstractmethod
def get_computer(self):
pass
5.3 定义具体建造者(ConcreteBuilder)
class GamingComputerBuilder(ComputerBuilder):
def __init__(self):
self.computer = Computer(None, None, None)
def build_cpu(self):
self.computer.cpu = "Intel i9"
def build_ram(self):
self.computer.ram = "32GB"
def build_hdd(self):
self.computer.hdd = "2TB SSD"
def get_computer(self):
return self.computer
class OfficeComputerBuilder(ComputerBuilder):
def __init__(self):
self.computer = Computer(None, None, None)
def build_cpu(self):
self.computer.cpu = "Intel i5"
def build_ram(self):
self.computer.ram = "8GB"
def build_hdd(self):
self.computer.hdd = "1TB HDD"
def get_computer(self):
return self.computer
5.4 定义指挥者(Director)
class Director:
def __init__(self, builder: ComputerBuilder):
self.builder = builder
def construct_computer(self):
self.builder.build_cpu()
self.builder.build_ram()
self.builder.build_hdd()
5.5 客户端代码(Client)
if __name__ == "__main__":
# 创建具体的建造者
gaming_builder = GamingComputerBuilder()
office_builder = OfficeComputerBuilder()
# 创建指挥者
director = Director(gaming_builder)
# 使用指挥者构建游戏电脑
director.construct_computer()
gaming_computer = gaming_builder.get_computer()
print("Gaming Computer:", gaming_computer)
# 使用指挥者构建办公电脑
director = Director(office_builder)
director.construct_computer()
office_computer = office_builder.get_computer()
print("Office Computer:", office_computer)
5.6 输出
Gaming Computer: Computer with CPU: Intel i9, RAM: 32GB, HDD: 2TB SSD
Office Computer: Computer with CPU: Intel i5, RAM: 8GB, HDD: 1TB HDD
6. 总结
- 建造者模式适用于创建复杂对象的场景,它通过将构建过程和对象的表示分离,使得可以灵活地构建不同类型的对象。
- 它通过不同的建造者(具体建造者)来控制对象的不同部分,而通过指挥者(Director)来统一管理构建过程,客户端只需要指定要构建的产品类型,而无需关注构建的细节。
- 这种模式的关键在于分步骤的构建,可以避免构造函数参数过多的问题,提高了代码的可读性和可维护性。
适用场景
- 当构造对象的算法独立于其部件的组成时。
- 当对象的构建过程非常复杂且需要分步骤时。
- 当客户端希望通过不同的方式创建不同的复杂对象时。
评论(0)