设计模式之建造者模式

目录

定义

建造者模式是一种创建型设计模式,其核心思想是将复杂对象的构建过程与其表示分离,使相同构建逻辑能生成不同结构的对象。该模式通过分步骤构建复杂对象,允许用户只指定对象类型和内容而无需了解内部构建细节。

结构

适用场景

1)对象具有复杂内部结构或需要多个配置参数时;

2)需要将对象的创建与使用分离;

3)相同构建过程需产生不同表现形式;

4)避免使用过长的构造器参数列表;

5)构建步骤可能变化或需要不同构建顺序时。

使用示例

这里以一台电脑的组装为例,来展示建造者模式的简单示例。

定义产品及建造者

复制代码
/**
 * 产品类:电脑(包含五大组件)
 */
@Data
public class Computer {
    private String cpu;       // 处理器
    private String ram;       // 内存
    private String storage;   // 硬盘
    private String gpu;       // 显卡
    private String motherboard; // 主板

    public Computer() {
    }

    @Override
    public String toString() {
        return "电脑配置:\n" +
                "CPU: " + cpu + "\n" +
                "内存: " + ram + "\n" +
                "硬盘: " + storage + "\n" +
                "显卡: " + gpu + "(独立显卡)\n" +
                "主板: " + motherboard;
    }

    // 抽象建造者(核心角色)
    public static abstract class Builder {
        
        protected Computer computer = new Computer();

        // 抽象构建方法
        public abstract Builder setCPU(String cpu);
        public abstract Builder setRAM(String ram);
        public abstract Builder setStorage(String storage);
        public abstract Builder setGPU(String gpu);
        public abstract Builder setMotherboard(String motherboard);

        // 最终构建方法
        public abstract Computer build();
    }

    // 具体建造者(实现抽象接口)
    public static class ComputerBuilder extends Builder {
        
        @Override
        public Builder setCPU(String cpu) {
            computer.setCpu(cpu);
            return this;
        }

        @Override
        public Builder setRAM(String ram) {
            computer.setRam(ram);
            return this;
        }

        @Override
        public Builder setStorage(String storage) {
            computer.setStorage(storage);
            return this;
        }

        @Override
        public Builder setGPU(String gpu) {
            computer.setGpu(gpu);
            return this;
        }

        @Override
        public Builder setMotherboard(String motherboard) {
            computer.setMotherboard(motherboard);
            return this;
        }

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

定义指挥者

复制代码
public class ComputerDirector {

    public Computer constructHighEndComputer(Computer.Builder builder) {
        return builder.setCPU("AMD Ryzen 9 7950X")
                .setRAM("32GB DDR5 6000MHz")
                .setStorage("2TB PCIe 4.0 NVMe SSD")
                .setGPU("AMD Radeon RX 7900 XTX")
                .setMotherboard("X670E AORUS Master")
                .build();
    }

    public Computer constructOfficeComputer(Computer.Builder builder) {
        return builder.setCPU("Intel Core i5-13400")
                .setRAM("16GB DDR4 3200MHz")
                .setStorage("512GB SSD")
                .setGPU("Intel UHD Graphics 730") // 集成显卡
                .setMotherboard("B760M AORUS Elite AX")
                .build();
    }

}

测试

复制代码
public class Client {

    public static void main(String[] args) {
        ComputerDirector director = new ComputerDirector();

        // 构建游戏电脑
        Computer gamingPC = director.constructHighEndComputer(
                new Computer.ComputerBuilder()
        );
        System.out.println("=== 高性能游戏电脑 ===");
        System.out.println(gamingPC);

        // 构建办公电脑
        Computer officePC = director.constructOfficeComputer(
                new Computer.ComputerBuilder()
        );
        System.out.println("=== 办公电脑 ===");
        System.out.println(officePC);
    }
}
相关推荐
带刺的坐椅17 小时前
用 ChatModel 构建 LLM 驱动的 Java 应用
java·ai·llm·solon·rag·chatmodel
用户37215742613519 小时前
Java 将 Word 文档转换为 Markdown:基础转换与导出选项详解
java
行者全栈架构师19 小时前
PolarDB + Spring Boot 实战:从自建MySQL到云原生数据库的零停机迁移
java·后端·架构
karry_k1 天前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
karry_k1 天前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端
SamDeepThinking2 天前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
她的男孩2 天前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
荣码2 天前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
plainGeekDev2 天前
Gson → kotlinx.serialization
android·java·kotlin