设计模式-建造者模式

在面向对象的设计中,建造者模式(Builder Pattern) 是一种常用的设计模式,它属于创建型模式 ,旨在将复杂对象的创建与其表示分离。通过该模式,我们可以一步一步地构造一个复杂的对象,避免构造函数的复杂化,同时提高代码的可维护性和可扩展性。

在这篇文章中,我们将深入了解建造者模式的概念、结构、实现方式以及应用场景,帮助你更好地理解这一设计模式。

1. 什么是建造者模式?

建造者模式用于构建一个复杂的对象 。它的主要思想是将对象的构建过程与其表示分离,允许通过相同的构建过程创建不同的表示。

适用场景:

  • 当你需要创建的对象包含多个组成部分,而这些部分之间的组合顺序或者选项组合比较复杂时,可以考虑使用建造者模式。
  • 当一个对象的创建过程中,可能有很多可选的参数或者配置选项时,也非常适合采用建造者模式。

2. 建造者模式的结构

建造者模式通常涉及以下几个角色:

1. 产品(Product)

  • 这是最终构建出来的复杂对象。在建造者模式中,产品通常由多个部件组成。

2. 建造者(Builder)

  • 负责定义创建产品的各个部分,且通过接口声明构建步骤。建造者通常是一个抽象类或接口,定义了创建各个部件的方法。

3. 具体建造者(ConcreteBuilder)

  • 实现建造者接口,负责实现具体的创建步骤,逐步构建复杂对象。每个具体建造者负责构建不同的产品或具有不同配置的产品。

4. 指挥者(Director)

  • 负责指导构建过程。它会调用建造者的各个方法,按照某种顺序来完成产品的创建。

5. 客户端(Client)

  • 调用指挥者来构建产品,最终得到一个构建好的复杂对象。

UML 类图:

复制代码
图片来源

3. 建造者模式的实现

我们来看一个具体的例子,假设我们需要构建一个计算机对象,该计算机有多个部件,如:CPU、内存、硬盘等,并且每个部件有不同的配置。

3.1 定义产品(Product)

python 复制代码
class Computer: 
    def __init__(self, cpu, ram, hard_disk): 
        self.cpu = cpu 
        self.ram = ram 
        self.hard_disk = hard_disk 

    def __str__(self): 
        return f"Computer [CPU={self.cpu}, RAM={self.ram}, Hard Disk={self.hard_disk}]"

3.2 定义建造者(Builder)

python 复制代码
from abc import ABC, abstractmethod

class ComputerBuilder(ABC):
    @abstractmethod
    def build_cpu(self):
        pass

    @abstractmethod
    def build_ram(self):
        pass

    @abstractmethod
    def build_hard_disk(self):
        pass

    @abstractmethod
    def get_computer(self): # 获取建造结果
        pass

3.3 实现具体建造者(ConcreteBuilder)

python 复制代码
"""
我们建造两种电脑机型,游戏机、办公机
这两种机型分别有不同的配置
"""

class GamingComputerBuilder(ComputerBuilder):
    # 游戏机
    def __init__(self):
        self.computer = Computer("", "", "")

    def build_cpu(self):
        self.computer.cpu = "Intel Core i9"

    def build_ram(self):
        self.computer.ram = "32GB"

    def build_hard_disk(self):
        self.computer.hard_disk = "1TB SSD"

    def get_computer(self):
        return self.computer


class OfficeComputerBuilder(ComputerBuilder):
    # 办公机
    def __init__(self):
        self.computer = Computer("", "", "")

    def build_cpu(self):
        self.computer.cpu = "Intel Core i5"

    def build_ram(self):
        self.computer.ram = "8GB"

    def build_hard_disk(self):
        self.computer.hard_disk = "500GB HDD"

    def get_computer(self):
        return self.computer

3.4 定义指挥者(Director)

python 复制代码
# 指挥者负责指挥具体建造者建造产品

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

    def construct(self):
        self.builder.build_cpu()
        self.builder.build_ram()
        self.builder.build_hard_disk()

3.5 使用建造者模式

python 复制代码
# 创建一个 GamingComputer 的建造者
gaming_builder = GamingComputerBuilder()

# 创建一个 Director 对象
director = Director(gaming_builder)

# 指挥者构建 GamingComputer
director.construct()

# 获取构建好的产品
gaming_computer = gaming_builder.get_computer()
print(gaming_computer)

# 创建一个 OfficeComputer 的建造者
office_builder = OfficeComputerBuilder()

# 指挥者构建 OfficeComputer
director.builder = office_builder
director.construct()

# 获取构建好的产品
office_computer = office_builder.get_computer()
print(office_computer)

3.6 输出结果

Computer [CPU=Intel Core i9, RAM=32GB, Hard Disk=1TB SSD]

Computer [CPU=Intel Core i5, RAM=8GB, Hard Disk=500GB HDD]

4. 建造者模式的优点

  • 分离了复杂对象的构建过程与表示:使用建造者模式可以将复杂对象的构建过程与其表示分离,这样客户端代码就无需了解对象如何创建,可以专注于如何组织建造过程。
  • 灵活性高:不同的建造者可以创建不同配置的产品。用户可以自由选择需要的建造者,从而定制产品的构建。
  • 提高代码的可扩展性:如果有新的产品类型需要构建,可以通过添加新的建造者来实现,而无需修改现有的代码。

5. 建造者模式的缺点

  • 类的数量增加:使用建造者模式时,通常需要为每种产品创建多个建造者类,这会增加系统中的类数量。
  • 不适用于简单对象:如果对象的构建非常简单,使用建造者模式可能会导致不必要的复杂性。

6. 适用场景

  • 复杂对象的创建:当一个对象的构建需要多个步骤,且这些步骤有可能会变动时,使用建造者模式会使得代码更加清晰、易于维护。
  • 需要创建多个复杂对象:当一个系统需要创建多个类型的对象,并且这些对象有不同的配置时,可以通过使用不同的建造者来简化代码。

7. 总结

建造者模式通过分离对象的创建过程和表示,使得我们能够更加灵活、简洁地构建复杂对象。它在需要创建复杂对象或多个不同配置的对象时非常有用,可以有效减少构造函数的复杂度,同时提高代码的可维护性和可扩展性。

通过上面的例子,我们可以看到,建造者模式能够将构建的各个步骤分离并且组织起来,简化了客户端的使用过程,同时提高了系统的灵活性。

相关推荐
搞不懂语言的程序员1 分钟前
中介者模式详解及真实场景解决方案
设计模式·中介者模式
北京_宏哥10 分钟前
🔥PC端自动化测试实战教程-2-pywinauto 启动PC端应用程序 - 上篇(详细教程)
前端·windows·python
_x_w19 分钟前
【12】数据结构之基于线性表的排序算法
开发语言·数据结构·笔记·python·算法·链表·排序算法
北京_宏哥21 分钟前
🔥PC端自动化测试实战教程-1-pywinauto 环境搭建(详细教程)
前端·windows·python
不爱学英文的码字机器26 分钟前
Rust 的征服:从系统编程到全栈开发的 IT 新宠
开发语言·后端·rust
grrrr_132 分钟前
【ctfplus】python靶场记录-任意文件读取+tornado模板注入+yaml反序列化(新手向)
python·web安全·tornado
ππ记录1 小时前
python面试技巧
python·python面试·python面试技巧·python面试能力
csdn_aspnet1 小时前
windows 安装 pygame( pycharm)
python·pycharm·pygame
这里有鱼汤1 小时前
Python自动化神器Playwright:让浏览器乖乖听话的终极指南!
后端·爬虫·python
海天一色y1 小时前
Pycharm(十三)容器类型的公共运算符和公共方法
ide·python·pycharm