设计模式-建造者模式

在面向对象的设计中,建造者模式(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. 总结

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

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

相关推荐
佛系小嘟嘟2 小时前
Android Jetpack Compose开发小组件【入门篇】
android·开发语言·android jetpack·小组件
Java知识日历3 小时前
【内含例子代码】Spring框架的设计模式应用(第二集)
java·开发语言·后端·spring·设计模式
尘浮生5 小时前
Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven
军训猫猫头5 小时前
36.Add的用法 C#例子
开发语言·c#
暗碳7 小时前
cloudns二级免费域名python更新ipv6 dns记录
开发语言·python
BlackPercy7 小时前
[paddle] 非线性拟合问题的训练
python·机器学习·paddlepaddle·paddle
个人开发-胡涂涂8 小时前
开源:软件世界的革命者
开发语言·开源
wcyd9 小时前
如何使用Python生成词云图:结合`wordcloud`、`imageio`、`collections`和`jieba`分词模块
开发语言·python·信息可视化
ONE_PUNCH_Ge9 小时前
Python3 正则表达式
python