创建型 中等
建造者模式
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