news 2026/9/3 1:42:30

Python 建造者模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 建造者模式

Python 中的建造者模式(Builder Pattern)

建造者模式是一种创建型设计模式,用于将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

核心目的
当一个对象有许多可选参数、配置项,或者构建步骤复杂时,使用建造者模式可以让代码更清晰、可读性更高,避免出现“ telescoping constructor”(超长构造函数)问题。

典型应用场景
  • 创建复杂对象(如 HTML、SQL 查询、配置文件、Pizza、电脑配置等)
  • 需要一步步配置对象的属性
  • 同一个构建过程需要产生不同配置的对象
  • 构建过程必须保持稳定,但最终产品有多种变体
建造者模式 vs 工厂模式
  • 工厂模式关注“创建什么对象”
  • 建造者模式关注“如何一步步构建一个复杂对象”
Python 实现示例:定制 Pizza

我们用一个经典例子——定制披萨,来演示建造者模式。

fromabcimportABC,abstractmethodfromtypingimportList# 最终产品:PizzaclassPizza:def__init__(self):self.size:str=""self.crust:str=""self.sauce:str=""self.cheese:str=""self.toppings:List[str]=[]def__str__(self):returnf""" Pizza: Size:{self.size}Crust:{self.crust}Sauce:{self.sauce}Cheese:{self.cheese}Toppings:{', '.join(self.toppings)or'None'}""".strip()# 抽象建造者classPizzaBuilder(ABC):@abstractmethoddefset_size(self,size:str):pass@abstractmethoddefset_crust(self,crust:str):pass@abstractmethoddefset_sauce(self,sauce:str):pass@abstractmethoddefadd_cheese(self,cheese:str):pass@abstractmethoddefadd_topping(self,topping:str):pass@abstractmethoddefget_pizza(self)->Pizza:pass# 具体建造者:Margherita Pizza BuilderclassMargheritaPizzaBuilder(PizzaBuilder):def__init__(self):self.pizza=Pizza()defset_size(self,size:str):self.pizza.size=sizereturnself# 支持链式调用defset_crust(self,crust:str):self.pizza.crust=crustreturnselfdefset_sauce(self,sauce:str):self.pizza.sauce="Tomato"# Margherita 固定番茄酱returnselfdefadd_cheese(self,cheese:str):self.pizza.cheese="Mozzarella"returnselfdefadd_topping(self,topping:str):iftopping.lower()=="basil":self.pizza.toppings.append(topping)returnselfdefget_pizza(self)->Pizza:returnself.pizza# 具体建造者:Pepperoni Pizza BuilderclassPepperoniPizzaBuilder(PizzaBuilder):def__init__(self):self.pizza=Pizza()defset_size(self,size:str):self.pizza.size=sizereturnselfdefset_crust(self,crust:str):self.pizza.crust=crustreturnselfdefset_sauce(self,sauce:str):self.pizza.sauce=saucereturnselfdefadd_cheese(self,cheese:str):self.pizza.cheese=cheesereturnselfdefadd_topping(self,topping:str):self.pizza.toppings.append(topping)returnselfdefget_pizza(self)->Pizza:returnself.pizza# 指挥者(Director):可选,用于定义构建顺序classPizzaChef:def__init__(self,builder:PizzaBuilder):self.builder=builderdefmake_pizza(self,size:str):return(self.builder.set_size(size).set_crust("Thin").set_sauce("Tomato").add_cheese("Mozzarella").get_pizza())# 使用示例if__name__=="__main__":# 方式1:使用指挥者(标准流程)margherita_builder=MargheritaPizzaBuilder()chef=PizzaChef(margherita_builder)pizza1=chef.make_pizza("Large")pizza1.toppings.append("Basil")# 额外添加print(pizza1)# 方式2:手动链式构建(更灵活,Python 中常见)pepperoni_builder=PepperoniPizzaBuilder()pizza2=(pepperoni_builder.set_size("Medium").set_crust("Stuffed").set_sauce("Spicy Tomato").add_cheese("Cheddar").add_topping("Pepperoni").add_topping("Mushrooms").add_topping("Olives").get_pizza())print(pizza2)
Python 中的简化版(更 Pythonic)

Python 支持链式调用(返回 self)和默认参数,因此可以实现更简洁的建造者:

classPizza:def__init__(self,size="Medium"):self.size=size self.crust="Classic"self.sauce="Tomato"self.cheese="Mozzarella"self.toppings=[]defset_crust(self,crust):self.crust=crustreturnselfdefset_sauce(self,sauce):self.sauce=saucereturnselfdefadd_topping(self,topping):self.toppings.append(topping)returnselfdef__str__(self):returnf"{self.size}{self.crust}pizza with{self.sauce},{self.cheese}, toppings:{self.toppings}"# 直接使用(无需额外 Builder 类)pizza=(Pizza("Large").set_crust("Thin").set_sauce("BBQ").add_topping("Chicken").add_topping("Onions"))print(pizza)

这种方式在 Python 社区更常见,因为简洁且易读。

建造者模式结构总结
角色职责
Product复杂对象(Pizza)
Builder抽象接口,定义构建步骤
ConcreteBuilder实现具体构建逻辑,返回产品
Director(可选)编排构建顺序
优点
  • 构建过程与表示分离
  • 一步步构建,代码可读性高
  • 支持链式调用(Fluent Interface)
  • 易于扩展新产品类型
缺点
  • 如果产品简单,引入建造者会过度设计
  • 需要更多类
实际推荐(Python 项目中)
  • 对象参数不多:直接用默认参数 + 可选参数
  • 参数中等(5-10个):用链式方法(Fluent Builder)
  • 参数很多或构建复杂:使用完整建造者模式 + Director

如果你想看其他例子(如构建 SQL 查询、HTML 字符串、DataFrame 配置、游戏角色创建等),欢迎告诉我!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 3:12:51

Dify在法律文书生成中的格式规范性保障

Dify在法律文书生成中的格式规范性保障 在律师事务所的日常工作中,一份起诉状可能因为标题层级错位、引用法条过时或缺少关键段落而被法院退回;一份合同因金额书写格式不统一、签名位置缺失而在商务谈判中显得不够专业。这些看似“细节”的问题&#xff…

作者头像 李华
网站建设 2026/9/3 0:00:20

openmv与stm32通信实时性分析:STM32F4性能测试报告

OpenMV与STM32通信实时性实测:如何榨干STM32F4的串口性能?你有没有遇到过这种情况——OpenMV明明“咔嚓”一下就识别出了目标,但你的小车却慢半拍地转向?或者AGV在避障时突然抖了一下,像是卡顿了一帧视觉?别…

作者头像 李华
网站建设 2026/9/2 7:00:04

Dify平台的会话上下文长度管理策略

Dify平台的会话上下文长度管理策略 在构建智能客服、AI助手或内容生成系统时,你是否曾遇到这样的尴尬:用户刚聊到第三轮,AI突然“失忆”,忘了之前说好的角色设定;或者更糟——请求直接报错,提示“上下文过长…

作者头像 李华
网站建设 2026/9/3 0:01:57

Open-AutoGLM性能提升5倍的秘密:动态图学习机制深度剖析

第一章:Open-AutoGLM性能提升5倍的秘密:动态图学习机制深度剖析Open-AutoGLM 在图神经网络(GNN)领域实现了高达5倍的性能提升,其核心突破在于引入了创新的动态图学习机制。该机制不再依赖静态图结构,而是根…

作者头像 李华
网站建设 2026/9/3 3:14:22

图文转Word自动化文档生成终极指南:一键生成,效率翻倍

还在为图文排版抓狂吗?会议记录、产品说明、培训材料...每次都要花几个小时复制粘贴、调整格式?今天我要为你分享一个3分钟搞定图文转Word的方法,让你彻底告别手动排版的烦恼! 【免费下载链接】Awesome-Dify-Workflow 分享一些好用…

作者头像 李华
网站建设 2026/9/3 0:22:02

IDM激活脚本完整使用指南:三步实现永久试用期锁定

IDM激活脚本完整使用指南:三步实现永久试用期锁定 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager试用期到期而烦恼…

作者头像 李华