设计模式之建造者模式

目录

定义

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

结构

适用场景

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);
    }
}
相关推荐
foxbillcsdn11 分钟前
《Redis应用实例》Java实现(28):栈
java·redis
serendipity_hky23 分钟前
【微服务 - easy视频 | day01】准备工具+gateway网关及路由至内部服务
java·微服务·架构·gateway·springcloud
Geoking.24 分钟前
【Java】Java 中 @Resource 与 @Autowired 的区别详解
java·开发语言
weixin_441455261 小时前
说说Java有哪些集合类
java·开发语言
合作小小程序员小小店1 小时前
web网页开发,在线%台球俱乐部管理%系统,基于Idea,html,css,jQuery,jsp,java,ssm,mysql。
java·前端·jdk·intellij-idea·jquery·web
李宥小哥1 小时前
创建型设计模式1
stm32·嵌入式硬件·设计模式
程序定小飞2 小时前
基于springboot的作业管理系统设计与实现
java·开发语言·spring boot·后端·spring
晓庆的故事簿2 小时前
windows下载和使用minio,结合java和vue上传文件
java·开发语言
李宥小哥2 小时前
结构型设计模式2
网络·数据库·设计模式