生成器
更新: 6/22/2025 字数: 0 字 时长: 0 分钟
定义
生成器模式 (Builder Pattern) 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
角色
- 产品 (Product): 最终构建的复杂对象
- 生成器 (Builder): 声明创建产品各部分的抽象接口
- 具体生成器 (ConcreteBuilder): 实现 Builder 接口,构造和装配产品
- 指挥者 (Director): 使用 Builder 接口构建对象
- 客户端 (Client): 创建 Director 对象并配置所需 Builder
实现
java
// 产品:电脑
class Computer {
private String cpu;
private String ram;
private String storage;
private String gpu;
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 void setGpu(String gpu) { this.gpu = gpu; }
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", storage='" + storage + '\'' +
", gpu='" + (gpu != null ? gpu : "集成显卡") + '\'' +
'}';
}
}
// 抽象生成器
interface ComputerBuilder {
void buildCpu();
void buildRam();
void buildStorage();
void buildGpu();
Computer getResult();
}
// 具体生成器:游戏电脑
class GamingComputerBuilder implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildCpu() {
computer.setCpu("Intel i9-13900K");
}
@Override
public void buildRam() {
computer.setRam("32GB DDR5");
}
@Override
public void buildStorage() {
computer.setStorage("2TB NVMe SSD");
}
@Override
public void buildGpu() {
computer.setGpu("NVIDIA RTX 4090");
}
@Override
public Computer getResult() {
return computer;
}
}
// 具体生成器:办公电脑
class OfficeComputerBuilder implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildCpu() {
computer.setCpu("Intel i5-13400");
}
@Override
public void buildRam() {
computer.setRam("16GB DDR4");
}
@Override
public void buildStorage() {
computer.setStorage("512GB SSD");
}
@Override
public void buildGpu() {
// 办公电脑不需要独立显卡
}
@Override
public Computer getResult() {
return computer;
}
}
// 指挥者
class ComputerDirector {
public Computer construct(ComputerBuilder builder) {
builder.buildCpu();
builder.buildRam();
builder.buildStorage();
builder.buildGpu();
return builder.getResult();
}
}
// 客户端
public class BuilderClient {
public static void main(String[] args) {
ComputerDirector director = new ComputerDirector();
// 构建游戏电脑
Computer gamingPC = director.construct(new GamingComputerBuilder());
System.out.println("游戏电脑配置:" + gamingPC);
// 构建办公电脑
Computer officePC = director.construct(new OfficeComputerBuilder());
System.out.println("办公电脑配置:" + officePC);
}
}
优缺点
优点:
- 封装性好:客户端不需要知道产品内部组成细节
- 构建过程可控制:通过 Director 控制构建过程
- 解耦:将构建代码与业务代码分离
- 可扩展:增加新的具体生成器无需修改现有代码
缺点:
- 产品差异大时难以定义通用 Builder 接口
- 增加系统复杂度(需要创建多个新类)
应用场景
- 创建复杂对象,其组成部分需要按特定顺序创建
- 需要创建的对象有不同的表示形式
- 需要避免"重叠构造器"问题(当构造器参数过多时)
- 需要隔离复杂对象的创建和使用
变体
- 流式生成器 (Fluent Builder): 使用方法链使代码更简洁
- 静态内部类生成器: 在 Product 类内部定义静态 Builder 类
- 泛型生成器: 使用泛型支持不同类型产品的构建