3.设计模式-BUILDER(生成器)
一、模式定义与核心价值
建造者模式是一种创建型设计模式,其核心目标是将复杂对象的构建过程与最终表示分离,使得同一构建流程可以生成不同表现形式的对象
核心价值:
- 构建解耦:将对象的多参数初始化过程封装,避免构造器参数爆炸
- 流程可控:通过分步构建确保对象创建过程的正确性与完整性
- 扩展灵活:新增对象表现形式时无需修改既有构建逻辑
工业级场景:
- 需要创建包含多个组件的复杂对象(如汽车、电脑配置)
- 存在可选参数或参数依赖顺序的初始化场景
- 需要实现链式调用提升代码可读性
二、模式组成与UML类图
核心角色:
- Product(产品):最终构建的复杂对象
- Builder(抽象建造者):定义构建步骤的接口
- ConcreteBuilder(具体建造者):实现具体构建逻辑
- Director(指导者):控制构建流程(可选角色)
UML类图:
classDiagram
class Director {
+construct(builder: Builder)
}
class Builder {
<<interface>>
+buildPartA()
+buildPartB()
+getResult() Product
}
class ConcreteBuilder {
-product: Product
+buildPartA()
+buildPartB()
+getResult() Product
}
class Product {
+setPartA()
+setPartB()
}
Director --> Builder
Builder <|.. ConcreteBuilder
ConcreteBuilder --> Product

角色协作流程:
- 客户端创建
Director并配置具体Builder Director调用Builder接口方法完成分步构建- 最终通过
getResult()获取完整产品对象
三、代码实现示例
场景:构建一台包含CPU、内存、硬盘的计算机
- 定义产品类
class Computer {
private String cpu;
private String ram;
private String storage;
public void setCpu(String cpu) { this.cpu = cpu; }
public void setRam(String ram) { this.ram = ram; }
public void setStorage(String storage) { this.storage = storage; }
public String getSpec() {
return String.format("CPU: %s | RAM: %s | Storage: %s", cpu, ram, storage);
}
}
- 抽象建造者接口
interface ComputerBuilder {
void buildCPU();
void buildRAM();
void buildStorage();
Computer getResult();
}
- 具体建造者实现
class GamingComputerBuilder implements ComputerBuilder {
private Computer computer = new Computer();
public void buildCPU() { computer.setCpu("Intel i9-13900K"); }
public void buildRAM() { computer.setRam("DDR5 64GB"); }
public void buildStorage() { computer.setStorage("2TB NVMe SSD"); }
public Computer getResult() { return computer; }
}
class OfficeComputerBuilder implements ComputerBuilder { /* 类似实现 */ }
- 指导者类(可选)
class ComputerDirector {
public Computer construct(ComputerBuilder builder) {
builder.buildCPU();
builder.buildRAM();
builder.buildStorage();
return builder.getResult();
}
}
- 客户端调用
public class Client {
public static void main(String[] args) {
ComputerDirector director = new ComputerDirector();
// 构建游戏电脑
Computer gamingPC = director.construct(new GamingComputerBuilder());
System.out.println(gamingPC.getSpec());
// 直接使用建造者(无指导者场景)
ComputerBuilder officeBuilder = new OfficeComputerBuilder();
officeBuilder.buildCPU();
officeBuilder.buildRAM();
Computer officePC = officeBuilder.getResult();
}
}
四、工业级源码应用
- Java标准库
**StringBuilder**:通过append()方法链式构建字符串6
StringBuilder sb = new StringBuilder()
.append("Hello")
.append(" ")
.append("World");
- Android开发
**AlertDialog.Builder**:分步构建对话框组件12
new AlertDialog.Builder(context)
.setTitle("提示")
.setMessage("确认删除?")
.setPositiveButton("确定", listener)
.create()
.show();
- 网络框架
- OkHttpClient:通过内部
Builder类配置网络参数6
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
- Lombok注解
**@Builder**:自动生成建造者模式代码5
@Builder
public class User {
private Long id;
private String name;
private String email;
}
// 使用方式
User user = User.builder().id(1L).name("Mike").build();
五、模式优缺点与适用场景
优势:
- 参数灵活:支持可选参数与构建顺序调整11
- 代码可读:链式调用提升代码表达力3
- 对象完整:通过
build()方法保证最终对象有效性
局限性:
- 类数量膨胀:每个产品需要对应建造者类9
- 性能损耗:中间对象创建增加GC压力11
适用场景:
- 需要创建包含多个组成部分的复杂对象
- 对象属性存在相互依赖或构建顺序要求
- 需要屏蔽复杂对象的创建细节
六、扩展变体与最佳实践
- 简化变体:
- 省略
Director角色,由客户端直接控制构建流程1 - 合并
Builder与Product角色(常见于链式调用实现)
- 线程安全实践:
- 对
Builder类进行同步控制 - 使用不可变对象确保构建结果安全
- 校验增强:
- 在
build()方法中加入参数校验逻辑
public Computer build() {
if (cpu == null) throw new IllegalStateException("CPU未配置");
return new Computer(this);
}
总结
建造者模式通过分步构建与结果解耦的设计哲学,为复杂对象的创建提供了优雅的解决方案。在Java生态中,该模式已深度融入主流框架与工具链,成为应对复杂初始化场景的利器。理解其核心思想并掌握灵活变通的使用方式,将显著提升代码的可维护性与扩展性。

浙公网安备 33010602011771号