建造者模式

简介: 建造者模式将复杂对象的构建过程与表示分离,通过指挥者调用具体建造者逐步创建产品,适用于构建步骤多、需不同表示的场景,提升代码可读性与扩展性,但会增加类数量,适合复杂对象构建。

建造者模式(Builder Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式常用于对象的构建过程复杂、需要多个步骤,或者需要使用不同的表示时。

  1. 建造者模式的结构
    建造者模式通常包含以下几个角色:

产品(Product):表示被构建的复杂对象。
建造者接口(Builder):定义了构建产品所需的各个步骤。
具体建造者(Concrete Builder):实现建造者接口,构建并返回产品的实例。
指挥者(Director):负责管理建造者的构建过程,调用建造器的方法以生成产品。

  1. 建造者模式的 UML 图
    plaintext
    +-------------------+
    |     Director      |
    +-------------------+
    | + construct()     |
    +-------------------+
            |
            |
    +-------+-------+
    |               |
    
    +---------------+ +---------------+
    | Builder | | ConcreteBuilder|
    +---------------+ +---------------+
    | + build_part()| | + build_part()|
    | + get_result()| | + get_result() |
    +---------------+ +---------------+
                   |
                   v
             +---------------+
             |     Product    |
             +---------------+
    
  2. 建造者模式的实现
    以下是一个 Python 中建造者模式的简单示例:

3.1 定义产品
python
class Product:
def init(self):
self.parts = []

def add(self, part: str) -> None:
    self.parts.append(part)

def show(self) -> None:
    print(f"Product parts: {', '.join(self.parts)}")

3.2 定义建造者接口
python
from abc import ABC, abstractmethod

class Builder(ABC):
@abstractmethod
def build_part_a(self) -> None:
pass

@abstractmethod
def build_part_b(self) -> None:
    pass

@abstractmethod
def get_result(self) -> Product:
    pass

3.3 实现具体建造者
python
class ConcreteBuilder(Builder):
def init(self):
self.product = Product()

def build_part_a(self) -> None:
    self.product.add("Part A")

def build_part_b(self) -> None:
    self.product.add("Part B")

def get_result(self) -> Product:
    return self.product

3.4 定义指挥者
python
class Director:
def init(self, builder: Builder) -> None:
self.builder = builder

def construct(self) -> None:
    self.builder.build_part_a()
    self.builder.build_part_b()

3.5 使用建造者模式
python
if name == "main":
builder = ConcreteBuilder()
director = Director(builder)

director.construct()
product = builder.get_result()

product.show()  # 输出: Product parts: Part A, Part B
  1. 建造者模式的优缺点
    优点
    封装复杂性:将构建过程与表示分开,使得构造复杂对象的过程更加清晰和可控。
    灵活性:可以根据不同的需求和环境来构建不同的产品。
    步骤化构建:可以在不同的步骤中改变构建的顺序或内容,提供了良好的灵活性和可扩展性。
    缺点
    类的数量增加:每个具体建造者都需要一个类,这可能会导致类的数量增加。
    复杂性:对于简单的对象构建,使用建造者模式可能显得过于复杂。
  2. 何时使用建造者模式
    当一个对象的构建过程复杂,需要多个步骤时。
    当构建过程应该允许不同的表示时。
    当构建的算法应该独立于使用的组件时。
  3. 总结
    建造者模式是一种有效的设计模式,用于处理复杂对象的构建。它通过将对象的构建逻辑与表示分离,提高了代码的可维护性和可读性。在实际应用中,合理运用建造者模式能够帮助开发者更好地管理复杂对象的创建过程。
相关文章
github创建token
github创建token
1033 0
|
存储 对象存储 CDN
Hexo从0到1搭建博客系列04:图床的最佳实践
Hexo从0到1搭建博客系列04:图床的最佳实践
992 0
|
7月前
|
设计模式 存储 关系型数据库
告别屎山代码!架构设计三大黄金原则 SOLID、DRY、KISS 全拆解
本文系统解析SOLID、DRY、KISS三大架构设计原则,结合正反示例深入阐释单一职责、开闭原则、里氏替换、接口隔离、依赖倒置等核心理念,强调原则协同落地与避坑指南,助开发者提升架构能力,打造简洁、健壮、可维护的高质量代码。
975 3
|
6月前
|
JSON 文字识别 数据格式
MinerU + RAG 集成实战:从 PDF 结构化解析到精准检索
本文详解 MinerU 与 RAG 的深度集成:针对 PDF 解析导致的召回瓶颈(如双栏错序、公式表格丢失),展示如何用 MinerU 实现结构化抽取(Markdown/JSON)、提升 Top-1 召回率25%,并提供 LangChain/LlamaIndex 全链路实战代码与生产避坑指南。
1492 0
|
9月前
|
弹性计算 关系型数据库 应用服务中间件
2026阿里云服务器新购及续费优惠参考:不同实例规格云服务器新购与续费相关政策介绍
2026年阿里云服务器新购和续费均不同程度的优惠,包括99元/年和199元/年的经济型及通用算力型实例,适合个人和企业用户。还有38元一年轻量应用服务器,新用户可抢购。此外,4核16G、8核32G及通用算力型u2a实例等也有优惠。续费方面,99元和199元实例可在活动期内每年以新购同价续费1次。其他实例续费也有折扣,具体以官方政策为准。
|
存储 数据管理 数据库
数据字典是什么?和数据库、数据仓库有什么关系?
在数据处理中,你是否常困惑于字段含义、指标计算或数据来源?数据字典正是解答这些问题的关键工具,它清晰定义数据的名称、类型、来源、计算方式等,服务于开发者、分析师和数据管理者。本文详解数据字典的定义、组成及其与数据库、数据仓库的关系,助你夯实数据基础。
数据字典是什么?和数据库、数据仓库有什么关系?
|
编解码 网络协议 数据安全/隐私保护
计网 - 图解OSI 七层模型 和 TCP/IP 四层模型
计网 - 图解OSI 七层模型 和 TCP/IP 四层模型
12184 0
|
存储 前端开发 中间件
『软件工程10』结构化系统分析:数据流图和字典案例分析
该文章通过具体案例分析了在软件工程中如何运用数据流图和数据字典来进行结构化系统分析,帮助明确系统的信息流程和数据定义。
『软件工程10』结构化系统分析:数据流图和字典案例分析
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session

热门文章

最新文章