漫谈设计模式 [5]:建造者模式

引导性开场

菜鸟:老鸟,我最近在写一个项目,发现很多对象初始化的代码特别复杂,感觉乱糟糟的。有没有什么好的方法能帮我简化这些代码?

老鸟:嗯,你提到的这个问题其实很常见。你有没有听说过设计模式?

菜鸟:听说过,但一直没深入研究。设计模式真的能解决这个问题吗?

老鸟 :当然可以!今天我们就来聊聊其中的一个:建造者模式(Builder Pattern)

渐进式介绍概念

老鸟:你可以把建造者模式想象成一个精心制作汉堡的过程。想象一下,你在一家汉堡店,你可以选择面包、肉饼、蔬菜、酱料等等。你可以按自己的喜好一步步定制一个汉堡。建造者模式就是把对象的创建过程分成多个步骤,逐步构建复杂对象。

菜鸟:哦,原来是这样!那建造者模式的核心思想是什么?

老鸟:核心思想就是将一个复杂对象的构建过程分离出来,使得构建过程可以一步步进行,并且不同的构建步骤可以有不同的实现方式。

Python代码示例,逐步展开

菜鸟:能给我看个具体的 Python 示例吗?

老鸟 :当然可以。我们先从简单的例子开始。假设我们要创建一个 House 对象,包含 wallsdoorswindowsroof。我们先写一个基础实现。

python 复制代码
class House:
    def __init__(self, walls=None, doors=None, windows=None, roof=None):
        self.walls = walls
        self.doors = doors
        self.windows = windows
        self.roof = roof

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

# 使用基础实现创建对象
house = House(walls=4, doors=2, windows=8, roof="Gable")
print(house)

菜鸟 :这个实现确实可以创建一个 House 对象,但感觉还是有些不够清晰,有点乱。

老鸟:你说得对。现在我们用建造者模式来改进它。

python 复制代码
class HouseBuilder:
    def __init__(self):
        self.house = House()

    def build_walls(self, walls):
        self.house.walls = walls
        return self

    def build_doors(self, doors):
        self.house.doors = doors
        return self

    def build_windows(self, windows):
        self.house.windows = windows
        return self

    def build_roof(self, roof):
        self.house.roof = roof
        return self

    def get_house(self):
        return self.house

# 使用建造者模式创建对象
builder = HouseBuilder()
house = (builder.build_walls(4)
                .build_doors(2)
                .build_windows(8)
                .build_roof("Gable")
                .get_house())
print(house)

问题与反思

菜鸟:我明白了,这样代码更清晰了。但为什么不能直接用普通的方式实现呢?

老鸟:这是个好问题。普通的实现有几个问题:1. 初始化参数过多时,代码不易维护。 2. 如果需要创建不同类型的对象,代码会变得非常复杂。3. 难以扩展。建造者模式可以很好地解决这些问题。

菜鸟:听起来不错,但如何解决扩展的问题呢?

老鸟:假设我们现在要给房子添加一个花园和一个车库。用建造者模式来实现就很简单。

python 复制代码
class HouseBuilder:
    # 省略之前的代码...

    def build_garden(self, garden):
        self.house.garden = garden
        return self

    def build_garage(self, garage):
        self.house.garage = garage
        return self

# 使用建造者模式创建带花园和车库的房子
builder = HouseBuilder()
house = (builder.build_walls(4)
                .build_doors(2)
                .build_windows(8)
                .build_roof("Gable")
                .build_garden("Beautiful Garden")
                .build_garage("Two-car Garage")
                .get_house())
print(house)

优势与适用场景

老鸟:建造者模式的优势很多,比如代码清晰、易于维护、便于扩展等。适用于以下场景:

  • 需要创建复杂对象时。
  • 对象创建过程需要分步骤进行。
  • 创建对象时需要灵活的构建过程。

常见误区与优化建议

菜鸟:有常见的误区和需要注意的地方吗?

老鸟:是的。常见误区包括:

  • 把建造者模式和工厂模式混淆。
  • 忽略建造者模式的分步骤特性。
    建议避免这些误区,确保每一步都清晰定义。

总结与延伸阅读

老鸟:今天我们讨论了建造者模式,从基础实现到逐步扩展,讲解了其优势和适用场景。你可以进一步阅读《设计模式:可复用面向对象软件的基础》这本书,了解更多设计模式。

菜鸟:谢谢老鸟!我觉得建造者模式真的很有用。我会继续学习其他设计模式。

老鸟:不客气!加油!

相关推荐
用户8356290780517 小时前
Python 操作 PowerPoint 页眉与页脚指南
后端·python
枫叶林FYL7 小时前
项目九:异步高性能爬虫与数据采集中枢 —— 基于 Crawl<sub>4</sub>AI 与 Playwright 的现代化数据采集平台 项目总览
爬虫·python·深度学习·wpf
猫猫的小茶馆8 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
Miss_min8 小时前
128K长序列数据生成
开发语言·python·深度学习
love530love8 小时前
MingLi-Bench 项目部署实录:基于 EPGF 架构的工程化实践
人工智能·windows·python·架构·aigc·epgf·mingli-bench
猿儿本无心9 小时前
快速搭建Python项目(Vscode+uv+FastAPI)
vscode·python·uv
AI算法沐枫9 小时前
大模型 | 大模型之机器学习基本理论
人工智能·python·神经网络·学习·算法·机器学习·计算机视觉
OzupeSir9 小时前
三门两羊问题 - 蒙提霍尔问题
python·概率论
晚霞的不甘9 小时前
CANN asnumpy 深度解析:NPU 原生 NumPy 的使用指南
人工智能·python·numpy
qingfeng154159 小时前
企业微信 API 自动化开发指南:从消息回调到智能运营实战
java·开发语言·python·自动化·企业微信