设计模式之建造者模式

目录

定义

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

结构

适用场景

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);
    }
}
相关推荐
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里1 天前
java中的继承和多态的区别
java
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖1 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时1 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang1 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi1 天前
mysql 查询所有表名并授权
java
ProcessOn官方账号1 天前
java函数式编程--入门基础
java·编程·函数式编程