自学教程 学编程从这里开始

建造者模式

《建造者模式》|设计模式系列第05篇

系列:创建型模式 · 建造者模式(Builder Pattern)
关键词:分步构建、复杂对象、产品组装、建造者、指挥者

一、什么是建造者模式

建造者模式(Builder Pattern):将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。

属于创建型设计模式。

简单理解:
当一个对象构造步骤很多,构造逻辑复杂,参数繁多时,把对象的创建步骤抽离出来。不管最终产品长什么样,组装流程固定;不同建造者可以实现不同零件的组装,产出不同产品。

核心意图
分离复杂对象的构建和表示。相同的构建流程,通过不同建造者,生成不同产品。客户端不需要关心对象内部零件如何组装。

适用场景

  1. 对象创建步骤复杂,创建逻辑较长,需要多步组装
  2. 一个类构造函数参数过多,大量参数可选,容易写错参数顺序
  3. 需要通过一套固定组装流程,生成不同版本的产品
  4. 对象创建过程需要隔离,产品内部结构对外隐藏

⚠️ 缺点预警:产品差异大时不适合使用;产品内部结构变化时,建造者也需要同步修改。

二、UML结构图

角色划分:

  1. Product(产品):复杂对象,包含多个组成零件
  2. Builder(抽象建造者):定义构建产品各个零件的抽象方法,提供获取产品接口
  3. ConcreteBuilder(具体建造者):实现抽象建造者,完成零件构建,组装产品
  4. Director(指挥者):调用建造者的构建步骤,控制组装顺序,不关心产品细节

三、Java 完整示例

场景:构建电脑 Computer,电脑包含 CPU、内存、硬盘、显示器。可以组装高配电脑、低配电脑。

1. 产品 Computer

public class Computer {
    private String cpu;
    private String memory;
    private String disk;
    private String screen;

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public void setDisk(String disk) {
        this.disk = disk;
    }

    public void setScreen(String screen) {
        this.screen = screen;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", disk='" + disk + '\'' +
                ", screen='" + screen + '\'' +
                '}';
    }
}

2. 抽象建造者 Builder

public abstract class ComputerBuilder {
    protected Computer computer = new Computer();

    public abstract void buildCpu();
    public abstract void buildMemory();
    public abstract void buildDisk();
    public abstract void buildScreen();

    public Computer getComputer() {
        return computer;
    }
}

3. 具体建造者

// 高配电脑建造者
public class HighConfigComputerBuilder extends ComputerBuilder {
    @Override
    public void buildCpu() {
        computer.setCpu("i9 处理器");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("64G 内存");
    }

    @Override
    public void buildDisk() {
        computer.setDisk("2TB SSD");
    }

    @Override
    public void buildScreen() {
        computer.setScreen("4K 显示器");
    }
}

// 低配电脑建造者
public class LowConfigComputerBuilder extends ComputerBuilder {
    @Override
    public void buildCpu() {
        computer.setCpu("i3 处理器");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("8G 内存");
    }

    @Override
    public void buildDisk() {
        computer.setDisk("512G SSD");
    }

    @Override
    public void buildScreen() {
        computer.setScreen("1080P 显示器");
    }
}

4. 指挥者 Director

public class Director {
    public Computer construct(ComputerBuilder builder){
        builder.buildCpu();
        builder.buildMemory();
        builder.buildDisk();
        builder.buildScreen();
        return builder.getComputer();
    }
}

5. 客户端调用

public class Client {
    public static void main(String[] args) {
        Director director = new Director();

        // 构建高配电脑
        ComputerBuilder highBuilder = new HighConfigComputerBuilder();
        Computer highPc = director.construct(highBuilder);
        System.out.println("高配电脑:" + highPc);

        // 构建低配电脑
        ComputerBuilder lowBuilder = new LowConfigComputerBuilder();
        Computer lowPc = director.construct(lowBuilder);
        System.out.println("低配电脑:" + lowPc);
    }
}

补充:日常开发中也常使用简化版建造者(链式Builder),没有独立 Director,就是我们常见的 xxx.builder().xxx().build(),例如 Lombok @Builder,属于建造者模式变种。

四、优缺点总结

✅ 优点

  1. 构建步骤清晰,创建过程拆解,方便控制对象创建细节
  2. 相同构建流程,创建不同产品;产品构建与表示分离
  3. 便于扩展新的产品实现,新增建造者即可
  4. 把复杂对象创建逻辑封装,客户端不用关心组装细节

❌ 缺点

  1. 如果产品内部结构差异巨大,不适合建造者模式
  2. 产品组件变化时,所有建造者都需要同步修改
  3. 类数量增加,代码复杂度上升

五、建造者模式 vs 工厂模式对比

模式关注点特点
工厂方法/抽象工厂生产产品实例,一次性产出对象侧重产品整体创建,不关心构建步骤
建造者模式分步组装复杂对象强调多步骤、顺序组装,精细控制每一个零件

六、框架源码应用

  • StringBuilder / StringBuffer:append 分步构建字符串,是建造者思想
  • Spring BeanDefinitionBuilder
  • Lombok @Builder 注解生成的链式构建器

七、小结

建造者核心:分步组装复杂对象,构建流程固定,零件实现可变。
当一个对象构造参数繁多、组装步骤复杂,优先考虑建造者模式。日常开发最常用简化链式 Builder(无指挥者)。

标签:

0 条笔记