创建者——建造者模式

建造者模式

建造者模式的目的在于分步骤构造复杂对象,通过将对象构建过程与其表示分离,使得同样的构造过程可以创建不同的对象形态。

特点

  • 解耦构建与装配:将对象的创建步骤抽象为独立的构造器
  • 灵活扩展:允许通过不同的具体建造者生成不同表现形式的对象

模式结构

角色 职责
抽象建造者(Builder) 定义创建产品实例的各个部件的抽象接口
具体建造者(ConcreteBuilder) 实现抽象建造者所定义的接口,创建一个复杂对象的各个部件
指挥者(Director) 控制构建流程,按顺序调用抽象建造者所定义的接口方法,完成复杂对象的创建
产品(Product) 由复杂对象的各个部件组成

要辨别是否套用了建造者模式,只需要确认是否存在上述4个角色。

简单示例

python 复制代码
class Car:                                             # 产品
    def __init__(self):
        self.engine = None
        self.wheels = None

    def __str__(self):
        return f'Engine: {self.engine}, Wheels: {self.wheels} \n'

class AbstractCarBuilder:                             # 抽象建造者
    def build_engine(self): pass
    def build_wheels(self): pass
    def get_car(self): pass

class SuvCarBuilder(AbstractCarBuilder):              # 具体建造者
    
    def __init__(self):
        self.car = Car()

    def build_engine(self):
        self.car.engine = 'V6 turbo'

    def build_wheels(self):
        self.car.wheels = 'mikilin'

    def get_car(self): 
        return self.car

class Director:                                       # 指挥者
    def construct(self, builder: AbstractCarBuilder):
        builder.build_engine()
        builder.build_wheels()
        return builder.get_car()

# 使用示例
director = Director()
builder = SuvCarBuilder()
my_car = director.construct(builder)
print(my_car)   # Engine: V6 turbo,Wheels: mikilin

应用场景

  • 参数复杂的对象:当对象需要多个初始化参数
  • 多形态的对象:当对象的表现形式有很多种
  • 构造复杂但形式一致的对象:当对象的创建过程需要根据参数的不同而变化

优缺点

  • 优点
    • 封装性好,构建和表示分离
    • 构建过程明确
    • 符合单一职责原则
  • 缺点
    • 代码复杂,多类协同
    • 创建过程复杂,需要控制流程

建造者模式 VS 工厂模式

对比点 建造者模式 工厂模式
适用场景 对象内部构建复杂 不同类别对象,但流程一致
创建过程 创建过程复杂,需要控制 创建过程简单,不需要控制
扩展方向 扩展产品构造方式(纵向型) 增加产品种类(横向型)

总而言之,在使用上看处理的是多类型对象还是一个类型的复杂对象,如果是后者,使用工厂模式,如果是前者,使用建造者模式。

相关推荐
木木_王7 分钟前
嵌入式Linux学习 | 数据结构 (Day05) 栈与队列详解(原理 + C 语言实现 + 实战实验 + 易错点剖析)
linux·c语言·开发语言·数据结构·笔记·学习
Muyuan199815 分钟前
22.让 RAG Agent 更像真实产品:聊天页面优化、PDF 上传、知识库重建与检索片段展示
python·django·pdf·fastapi
冷雨夜中漫步23 分钟前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai
超龄编码人26 分钟前
Qt Widgets Designer QTabWidget无法添加布局
开发语言·qt
程序员-小李26 分钟前
uv 学习总结:从零到一掌握现代化 Python 工具链
python·学习·uv
直奔標竿28 分钟前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
Python大数据分析@34 分钟前
CLI一键采集,使用Python搭建TikTok电商爬虫Agent
开发语言·爬虫·python
研究点啥好呢40 分钟前
高德多模态算法工程师面试题精选:10道高频考题+答案解析
python·面试·llm·求职招聘·笔试·高德
测试员周周1 小时前
【AI测试系统】第3篇:AI生成的测试用例太“水”?14年老兵:规则引擎+AI才是王炸组合
人工智能·python·测试
@小码农1 小时前
2026年3月Scratch图形化编程等级考试一级真题试卷
开发语言·数据结构·c++·算法