创建型 中等

建造者模式

Builder Pattern

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

概述

建造者模式是一种创建型设计模式,它允许你分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象。

适用场景

  • 当需要创建复杂对象时(对象包含多个组成部分)
  • 当需要创建不同形式的对象时(同一构建过程产生不同表示)
  • 当对象的构造过程必须允许不同的表示时
  • 当需要构建不同配置的对象变体时

优点

  • +可以分步骤创建对象,控制构建过程的细节
  • +可以复用相同的创建代码,构建不同的表示
  • +单一职责原则:将复杂的构造代码从产品的业务逻辑中分离出来
  • +更精细地控制对象构建过程
  • +可以创建不可变对象

缺点

  • 代码可能变得更加复杂,因为需要引入许多新的类(Builder、ConcreteBuilder)
  • 需要创建多个 Builder 类来支持不同的构建变体
  • 整体代码量增加

结构

classDiagram class Director { -builder: Builder +construct(): Product +setBuilder(builder: Builder): void } class Builder { +buildPartA(): void +buildPartB(): void +buildPartC(): void +getResult(): Product } class ConcreteBuilder1 { +product: Product +buildPartA(): void +buildPartB(): void +buildPartC(): void +getResult(): Product +reset(): void } class ConcreteBuilder2 { +product: Product +buildPartA(): void +buildPartB(): void +buildPartC(): void +getResult(): Product +reset(): void } class Product { -parts: List~String~ +addPart(part: String): void +showParts(): void } class Client { +main() } Director o-- Builder : uses ConcreteBuilder1 --|> Builder ConcreteBuilder2 --|> Builder ConcreteBuilder1 ..> Product : creates ConcreteBuilder2 ..> Product : creates Client ..> Director : uses Client ..> ConcreteBuilder1 : creates Client ..> ConcreteBuilder2 : creates style Director fill:#e8f5e9,stroke:#4caf50,stroke-width:2px style Builder fill:#fff3e0,stroke:#ff9800,stroke-width:2px style Product fill:#e3f2fd,stroke:#2196f3,stroke-width:2px style ConcreteBuilder1 fill:#fce4ec,stroke:#e91e63,stroke-width:1px style ConcreteBuilder2 fill:#f3e5f5,stroke:#9c27b0,stroke-width:1px

交互演示

分步骤构建复杂对象
Directorconstruct()
buildFoundation()
buildWalls()
buildRoof()
🏗️
Building...
构建进度: 0%

生活类比

建造者模式就像是现实世界中的汽车装配线或房屋建筑

汽车装配

汽车装配线使用相同的步骤来组装不同型号的汽车,但每个步骤的具体实现可能不同。例如,豪华车型和标准车型都经过相同的装配流程,但使用的零件和配置不同。

房屋建造

建造房屋时,有设计师(Director)指挥建筑商(Builder)按照相同的步骤建造,但可以根据需求建造别墅、公寓或平房等不同类型的房屋。

代码实现

Example.java

实际应用

Java StringBuilder

Java 的 StringBuilder 类使用建造者模式来构建可变字符串,支持链式调用 append 方法。

Example.java

Lombok @Builder

Lombok 库通过注解自动生成建造者类,简化了建造者模式的实现。

Example.java

Python requests 库

Python 的 requests 库使用建造者模式构建 HTTP 请求,通过链式调用设置各种参数。

Example.java

练习

1

建造者模式的主要目的是什么?

2

在建造者模式中,Director 的作用是什么?

3

以下哪个不是建造者模式的组成部分?

4

建造者模式支持复用相同的构建代码来创建不同的产品表示