设计模式之建造者模式

生活场景

假设你要组装一台游戏电脑,包含:

CPU(Intel 或 AMD)

显卡(NVIDIA 或 AMD)

内存(16GB 或 32GB)

硬盘(SSD 或 HDD)

建造者模式的作用:将复杂对象的组装过程拆解成多个步骤,用不同的"装配工"(建造者)帮你组装不同配置的电脑,避免直接操作复杂的参数组合。

1.定义产品类

作用:

封装电脑的各个部件属性

提供显示配置的方法

复制代码
class Computer {
    private String cpu;
    private String gpu;
    private int ram;
    private String storage;

    // 通过构造函数设置属性(实际由建造者填充)
    public Computer() {}

    // Setter方法(建造者通过这些方法配置属性)
    public void setCpu(String cpu) { this.cpu = cpu; }
    public void setGpu(String gpu) { this.gpu = gpu; }
    public void setRam(int ram) { this.ram = ram; }
    public void setStorage(String storage) { this.storage = storage; }

    // 显示配置信息
    public void showSpecs() {
        System.out.println("CPU: " + cpu);
        System.out.println("GPU: " + gpu);
        System.out.println("RAM: " + ram + "GB");
        System.out.println("Storage: " + storage);
    }
}

2.定义建造者接口(装配工的标准装配流程)

作用:

规定组装电脑的 步骤顺序

确保所有建造者都按相同流程工作

java 复制代码
interface ComputerBuilder {
    void buildCpu();       // 装CPU
    void buildGpu();       // 装显卡
    void buildRam();       // 装内存
    void buildStorage();   // 装硬盘
    Computer getResult();  // 交付电脑
}

3.具体建造者实现(不同配置方案)

作用:

实现不同的 配置方案(高端/经济型)

每个建造者按自己的方式实现各步骤

3.1.高性能配置者

java 复制代码
class HighEndComputerBuilder implements ComputerBuilder {
    private Computer computer = new Computer();

    @Override
    public void buildCpu() {
        computer.setCpu("Intel i9-13900K"); // 高端CPU
    }

    @Override
    public void buildGpu() {
        computer.setGpu("NVIDIA RTX 4090"); // 旗舰显卡
    }

    @Override
    public void buildRam() {
        computer.setRam(32); // 大内存
    }

    @Override
    public void buildStorage() {
        computer.setStorage("2TB SSD"); // 高速硬盘
    }

    @Override
    public Computer getResult() {
        return computer;
    }
}

3.2.经济性配置建造者

java 复制代码
class BudgetComputerBuilder implements ComputerBuilder {
    private Computer computer = new Computer();

    @Override
    public void buildCpu() {
        computer.setCpu("AMD Ryzen 5"); // 中端CPU
    }

    @Override
    public void buildGpu() {
        computer.setGpu("AMD Radeon RX 7600"); // 性价比显卡
    }

    @Override
    public void buildRam() {
        computer.setRam(16); // 基础内存
    }

    @Override
    public void buildStorage() {
        computer.setStorage("512GB SSD + 1TB HDD"); // 混合存储
    }

    @Override
    public Computer getResult() {
        return computer;
    }
}

4.指挥者类(组装具体配置)

作用:

控制 组装顺序(先装CPU,再装显卡等)

客户端只需和指挥者交互,无需了解建造细节

java 复制代码
class Director {
    private ComputerBuilder builder;

    public Director(ComputerBuilder builder) {
        this.builder = builder; // 绑定具体的建造者
    }

    // 定义组装流程
    public Computer construct() {
        builder.buildCpu();
        builder.buildGpu();
        builder.buildRam();
        builder.buildStorage();
        return builder.getResult();
    }
}

5.客户端使用

关键逻辑:

用户只需选择建造者类型(HighEnd/Budget)

指挥者保证组装流程正确

最终得到不同配置但结构一致的电脑

java 复制代码
public class Client {
    public static void main(String[] args) {
        // 方案一:组装高端电脑
        ComputerBuilder highEndBuilder = new HighEndComputerBuilder();
        Director director = new Director(highEndBuilder);
        Computer gamingPC = director.construct();
        gamingPC.showSpecs();
        
        /* 输出:
           CPU: Intel i9-13900K
           GPU: NVIDIA RTX 4090
           RAM: 32GB
           Storage: 2TB SSD
        */

        // 方案二:组装经济型电脑
        ComputerBuilder budgetBuilder = new BudgetComputerBuilder();
        director = new Director(budgetBuilder);
        Computer officePC = director.construct();
        officePC.showSpecs();
        
        /* 输出:
           CPU: AMD Ryzen 5
           GPU: AMD Radeon RX 7600
           RAM: 16GB
           Storage: 512GB SSD + 1TB HDD
        */
    }
}

总结

优点:

构造过程可控:分步骤构造复杂对象

配置灵活:通过不同建造者实现不同配置

隐藏细节:客户端不直接操作产品内部结构

扩展性示例(新增配置)

要新增一个「轻薄本配置」:

创建 UltrabookBuilder 实现 ComputerBuilder 接口

在建造方法中设置轻薄本专用配置(如低电压CPU、集成显卡)

客户端使用新建造者即可

原有代码无需修改,符合开闭原则(对扩展开放,对修改关闭)

相关推荐
飞翔中文网1 小时前
Java设计模式之代理模式
java·设计模式
萧萧玉树4 小时前
设计模式-组件协作
c++·设计模式
杨充21 小时前
07.迪米特原则介绍
设计模式
码农的天塌了1 天前
Java 设计模式之享元模式(Flyweight Pattern)
java·设计模式·享元模式
11在上班1 天前
剖析initData在水合中的设计哲学
前端·设计模式
找了一圈尾巴1 天前
设计模式(创建型)-单例模式
单例模式·设计模式
用户86178277365181 天前
责任链
java·后端·设计模式
hope_wisdom1 天前
实战设计模式之解释器模式
设计模式·解释器模式·软件工程·软件构建·架构设计
开发者工具分享2 天前
微服务架构中10个常用的设计模式
微服务·设计模式·架构