建造者模式

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

建造者模式(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
1014 0
|
存储 对象存储 CDN
Hexo从0到1搭建博客系列04:图床的最佳实践
Hexo从0到1搭建博客系列04:图床的最佳实践
975 0
|
6月前
|
设计模式 存储 关系型数据库
告别屎山代码!架构设计三大黄金原则 SOLID、DRY、KISS 全拆解
本文系统解析SOLID、DRY、KISS三大架构设计原则,结合正反示例深入阐释单一职责、开闭原则、里氏替换、接口隔离、依赖倒置等核心理念,强调原则协同落地与避坑指南,助开发者提升架构能力,打造简洁、健壮、可维护的高质量代码。
869 3
|
5月前
|
JSON 文字识别 数据格式
MinerU + RAG 集成实战:从 PDF 结构化解析到精准检索
本文详解 MinerU 与 RAG 的深度集成:针对 PDF 解析导致的召回瓶颈(如双栏错序、公式表格丢失),展示如何用 MinerU 实现结构化抽取(Markdown/JSON)、提升 Top-1 召回率25%,并提供 LangChain/LlamaIndex 全链路实战代码与生产避坑指南。
1314 0
|
存储 数据管理 数据库
数据字典是什么?和数据库、数据仓库有什么关系?
在数据处理中,你是否常困惑于字段含义、指标计算或数据来源?数据字典正是解答这些问题的关键工具,它清晰定义数据的名称、类型、来源、计算方式等,服务于开发者、分析师和数据管理者。本文详解数据字典的定义、组成及其与数据库、数据仓库的关系,助你夯实数据基础。
数据字典是什么?和数据库、数据仓库有什么关系?
|
编解码 网络协议 数据安全/隐私保护
计网 - 图解OSI 七层模型 和 TCP/IP 四层模型
计网 - 图解OSI 七层模型 和 TCP/IP 四层模型
12147 0
|
存储 前端开发 中间件
『软件工程10』结构化系统分析:数据流图和字典案例分析
该文章通过具体案例分析了在软件工程中如何运用数据流图和数据字典来进行结构化系统分析,帮助明确系统的信息流程和数据定义。
『软件工程10』结构化系统分析:数据流图和字典案例分析
|
机器学习/深度学习 人工智能 运维
智能运维:AI驱动的IT运维革命###
【10月更文挑战第21天】 随着数字化转型的深入,智能运维(AIOps)正逐步成为企业IT管理的核心。本文将探讨AI技术如何赋能运维领域,通过自动化、智能化手段提升系统稳定性和效率,降低运营成本,并分享实施智能运维的最佳实践与挑战应对策略。 ###
1529 1
|
自然语言处理 资源调度 前端开发
前端大模型入门(四):不同文本分割器对比和效果展示-教你如何根据场景选择合适的长文本分割方式
本文详细介绍了五种Langchain文本分割器:`CharacterTextSplitter`、`RecursiveCharacterTextSplitter`、`TokenTextSplitter`、`MarkdownTextSplitter` 和 `LatexTextSplitter`,从原理、优缺点及适用场景等方面进行了对比分析,旨在帮助开发者选择最适合当前需求的文本分割工具,提高大模型应用的处理效率和效果。
3317 1

热门文章

最新文章