ITPub博客

首页 > 数据库 > 数据库开发技术 > Python设计模式(三):建造者模式(Builder Pattern)

Python设计模式(三):建造者模式(Builder Pattern)

原创 数据库开发技术 作者:jackzhang 时间:2024-07-22 06:30:00 0 删除 编辑

Hello,大家好,又到周一了,上班上课的都得早起啦。但是在这个心浮气躁的时代,学习总是要继续的。今天我将继续向大家分享Python设计模式的相关知识,今天的主角是建造者模式(Builder Pattern)。

之前我们分享了另外两种设计模式,即单例模式和工厂模式,大家可以从下面找到:

本文内容概览:
  1. 什么是建造者模式?
  2. 建造者模式的应用场景
  3. 真实场景的案例实现(Python版本)
  4. 建造者模式的优缺点

1. 建造者模式的定义?

建造者模式(Builder Pattern)是一种创建型设计模式,它通过将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。该模式主要解决了在复杂对象创建时,需要一步步构建并可以灵活控制建造过程的问题。

建造者模式主要包含以下几个角色,每个角色在模式中都有特定的作用,并且它们之间有明确的关系。

Builder(抽象建造者)

作用:定义创建复杂对象的各个部件的抽象接口。具体包括各个部件的创建方法,但不具体实现这些方法。

主要方法:

  • build_partA(): 构建对象的某个部件A。
  • build_partB(): 构建对象的某个部件B。
  • get_result(): 返回最终构建的复杂对象。

ConcreteBuilder(具体建造者)

作用:实现 Builder 接口,具体构建和装配各个部件,最终返回构建的复杂对象。

主要方法:

  • 实现抽象建造者定义的所有方法,例如 build_partA()、build_partB()。
  • get_result(): 返回最终构建的复杂对象。

Director(指挥者)

作用:构建一个使用 Builder 接口的对象。它主要负责控制构建过程的顺序。指挥者并不知道具体的产品细节,它只是通过 Builder 接口控制建造过程。

主要方法:

  • construct(): 调用具体建造者的方法按照一定顺序构建复杂对象。

Product(产品)

作用:表示被构建的复杂对象。具体的产品由多个部件组成。

角色之间的关系

  • Builder:定义了创建 Product 的各个部件的抽象接口。
  • ConcreteBuilder:实现了 Builder 接口,并且具体构建和装配各个部件,最后返回一个 Product 实例。
  • Director:依赖于 Builder 接口,控制创建产品的过程。它知道如何一步步创建一个复杂对象,但不知道具体的对象是什么。
  • Product:最终由 ConcreteBuilder 构建的复杂对象。

下面是建造者模式的UML图:

2. 建造者模式的应用场景

建造者模式适用于以下场景:

  • 当需要创建的对象有复杂的内部结构时。
  • 当需要创建的对象的属性相互依赖,需要指定其创建顺序时。
  • 当构造过程必须允许被构造的对象有不同的表示时。
  • 当需要在某个时间点创建对象,但在稍后的时间点再访问时。

3. 真实场景的案例实现

假设我们要创建一个复杂的 House 对象。House 由 walls、doors、windows 和 roof 等部件组成。用建造者模式实现如下:

from abc import ABC, abstractmethod

# Product role
class House:
    def __init__(self):
        self.walls = None
        self.doors = None
        self.windows = None
        self.roof = None

    def __str__(self):
        return f"House with {self.walls}, {self.doors}, {self.windows}, and {self.roof}."

# Builder role
class HouseBuilder(ABC):
    @abstractmethod
    def build_walls(self):
        pass

    @abstractmethod
    def build_doors(self):
        pass

    @abstractmethod
    def build_windows(self):
        pass

    @abstractmethod
    def build_roof(self):
        pass

    @abstractmethod
    def get_house(self):
        pass

# Concrete Builder role
class ConcreteHouseBuilder(HouseBuilder):
    def __init__(self):
        self.house = House()

    def build_walls(self):
        self.house.walls = 'brick walls'

    def build_doors(self):
        self.house.doors = 'wooden doors'

    def build_windows(self):
        self.house.windows = 'glass windows'

    def build_roof(self):
        self.house.roof = 'tiled roof'

    def get_house(self):
        return self.house

# Director role
class Director:
    def __init__(self, builder: HouseBuilder) -> None:
        self.builder = builder

    def construct(self):
        self.builder.build_walls()
        self.builder.build_doors()
        self.builder.build_windows()
        self.builder.build_roof()

# Client
def client_code(builder: HouseBuilder):
    director = Director(builder)
    director.construct()
    house = builder.get_house()
    print(house)

if __name__ == '__main__':
    builder = ConcreteHouseBuilder()
    client_code(builder)
House with brick walls, wooden doors, glass windows, and tiled roof.

4. 建造者模式的优缺点

优点:
  • 更好的控制复杂对象的构建过程:建造者模式允许逐步创建复杂对象,并且可以灵活地控制每一步的构建过程。
  • 分离构建和表示:使得同样的构建过程可以创建不同的表示,增强了代码的可维护性和扩展性。
  • 代码复用:通过不同的具体建造者,可以复用构建过程,生成不同类型的复杂对象。
缺点:
  • 代码复杂性高:建造者模式需要定义额外的 Builder 类和 Director 类,增加了代码的复杂性。
  • 不适合简单对象:对于简单对象的创建,使用建造者模式可能显得过于复杂。

5. Final words

总之,建造者模式非常适合在对象的创建过程中需要进行频繁修改和扩展的场景。例如,在开发游戏时,可能需要不断调整游戏角色的属性和能力,使用建造者模式可以方便地进行这些调整。

此外,建造者模式可以与其他设计模式结合使用,例如,建造者模式可以与原型模式(Prototype Pattern)(后面我们会单独讲到)结合,用于在构建复杂对象时进行对象的复制。

OK,关于建造者模式的知识就分享到这啦,感谢您的阅读!🙇‍🙇‍🙇‍


推荐阅读👇👇👇

Python设计模式(二):工厂模式(Factory Pattern)

你知道单例模式吗?Python如何实现?

每天都在用的20个Python技巧,让你从此告别平庸!

编写高效Python函数的5个技巧,真心建议你牢记,并当作此后编码的准绳!

Python自动化:适合新手练习的5个有趣又实用的Python脚本,帮你快速掌握编程技能!拿走不谢!

- END -

🌟 如果你喜欢这篇文章并且愿意支持我的话,你可以:🌟

  • 👍👍👍 点赞文章
  • ⤴️⤴️⤴️ 转发文章
  • ⚛️⚛️⚛️ 点击在看
  • 🧑‍🤝‍🧑🧑‍🤝‍🧑🧑‍🤝‍🧑 让文章被推荐给更多人,找到更多志同道合的伙伴
  • 👏👏👏 欢迎给我留言

关注我,第一时间接收更多关于Python、数据分析和机器学习的深入分析和最新趋势。我们一起探索数据的力量,解锁AI的潜能。你的每一次互动都是对我的极大鼓励,也是我们共同成长的动力!

👇👇👇 关注并开启星标提醒,让知识与技能的火花不断在你的职业道路上燃烧吧!

原文作者:数据派探险家;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-12-19

  • 博文量
    119
  • 访问量
    55941