设计模式之建造者模式

生活场景

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

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、集成显卡)

客户端使用新建造者即可

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

相关推荐
羞儿5 小时前
Agent设计模式与工程化
设计模式·知识图谱·agent·rag·mcp·指导开发
点云SLAM6 小时前
C++(C++17/20)最佳工厂写法和SLAM应用综合示例
开发语言·c++·设计模式·c++实战·注册工厂模式·c++大工程系统
Yu_Lijing10 小时前
基于C++的《Head First设计模式》笔记——状态模式
c++·笔记·设计模式
Engineer邓祥浩11 小时前
设计模式学习(18) 23-16 迭代器模式
学习·设计模式·迭代器模式
老蒋每日coding13 小时前
AI Agent 设计模式系列(十三)—— 人机协同模式
人工智能·设计模式·langchain
老蒋每日coding14 小时前
AI Agent 设计模式系列(十二)—— 异常处理和恢复模式
人工智能·设计模式
小码过河.14 小时前
设计模式——抽象工厂模式
设计模式·抽象工厂模式
国强_dev1 天前
量体裁衣在技术方案中的应用
设计模式·系统架构
Engineer邓祥浩1 天前
设计模式学习(16) 23-14 命令模式
学习·设计模式·命令模式
Maddie_Mo1 天前
智能体设计模式 第二章:路由模式
设计模式