Skip to content

生成器

更新: 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);
    }
}

优缺点

优点:

  1. 封装性好:客户端不需要知道产品内部组成细节
  2. 构建过程可控制:通过 Director 控制构建过程
  3. 解耦:将构建代码与业务代码分离
  4. 可扩展:增加新的具体生成器无需修改现有代码

缺点:

  1. 产品差异大时难以定义通用 Builder 接口
  2. 增加系统复杂度(需要创建多个新类)

应用场景

  1. 创建复杂对象,其组成部分需要按特定顺序创建
  2. 需要创建的对象有不同的表示形式
  3. 需要避免"重叠构造器"问题(当构造器参数过多时)
  4. 需要隔离复杂对象的创建和使用

变体

  • 流式生成器 (Fluent Builder): 使用方法链使代码更简洁
  • 静态内部类生成器: 在 Product 类内部定义静态 Builder 类
  • 泛型生成器: 使用泛型支持不同类型产品的构建

贡献者

The avatar of contributor named as LI SIR LI SIR
The avatar of contributor named as wkwbk wkwbk

页面历史