设计模式4-建造者模式

定义

Builder Partern:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(针对于构建对象的参数众多而提出的解耦合,创造复杂对象)

目的

● 使参数更加可视化和可以明确各个参数的定义

● 定义规范和约束

场景

● 当构建一个类的参数众多避免参数混乱时,可以使用建造者模式

实际使用

java.lang.StringBuilderjava.lang.StringBufferappend() 方法返回自身,类似于建造者的链式调用。

java.util.stream.Stream.Builder

代码

java 复制代码
// 产品类 - 计算机
public class Computer {
    // 必需参数
    private String cpu;
    private String ram;

    // 可选参数
    private String storage;
    private String graphicsCard;
    private boolean bluetoothEnabled;

    // 私有构造函数,只能通过Builder构建
    private Computer(ComputerBuilder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.storage = builder.storage;
        this.graphicsCard = builder.graphicsCard;
        this.bluetoothEnabled = builder.bluetoothEnabled;
    }

    // 省略 getter 方法...

    // 静态内部类 - 建造者
    public static class ComputerBuilder {
        // 必需参数
        private String cpu;
        private String ram;

        // 可选参数 - 初始化默认值
        private String storage = "500GB HDD";
        private String graphicsCard = "Integrated";
        private boolean bluetoothEnabled = false;

        // 建造者的构造函数,接收必需参数
        public ComputerBuilder(String cpu, String ram) {
            this.cpu = cpu;
            this.ram = ram;
        }

        // 用于设置可选参数的方法,并返回建造者本身以实现链式调用
        public ComputerBuilder setStorage(String storage) {
            this.storage = storage;
            return this;
        }

        public ComputerBuilder setGraphicsCard(String graphicsCard) {
            this.graphicsCard = graphicsCard;
            return this;
        }

        public ComputerBuilder setBluetoothEnabled(boolean bluetoothEnabled) {
            this.bluetoothEnabled = bluetoothEnabled;
            return this;
        }

        // 最终的构建方法,返回构建好的产品
        public Computer build() {
            // 可以在这里进行校验
            if (cpu == null || ram == null) {
                throw new IllegalArgumentException("CPU and RAM are required");
            }
            return new Computer(this);
        }
    }

    @Override
    public String toString() {
        return "Computer [cpu=" + cpu + ", ram=" + ram + ", storage=" + storage + ", graphicsCard=" + graphicsCard
                + ", bluetoothEnabled=" + bluetoothEnabled + "]";
    }
}

class Client {
    public static void main(String[] args) {
        // 使用建造者一步步构建产品,链式调用,清晰易懂
        Computer gamingComputer = new Computer.ComputerBuilder("Intel i9", "32GB")
                .setStorage("1TB NVMe SSD")
                .setGraphicsCard("NVIDIA RTX 4080")
                .setBluetoothEnabled(true)
                .build(); // 最终调用build方法构建对象

        System.out.println(gamingComputer);

        // 构建一个基础配置的电脑,只设置必需参数,使用可选参数的默认值
        Computer officeComputer = new Computer.ComputerBuilder("Intel i5", "16GB")
                .build();

        System.out.println(officeComputer);
    }
}

建造者模式代码

相关推荐
再学一点就睡2 小时前
手撕前端常用 7 种设计模式:从原理到实战,附完整代码案例
前端·设计模式
long3163 小时前
代理设计模式
java·学习·程序人生·设计模式·代理模式
穷儒公羊3 小时前
第二章 设计模式故事会之策略模式:魔王城里的勇者传说
python·程序人生·设计模式·面试·跳槽·策略模式·设计规范
晴空雨4 小时前
💥 React 容器组件深度解析:从 Props 拦截到事件改写
前端·react.js·设计模式
ss2731 天前
手写MyBatis第32弹-设计模式实战:Builder模式在MyBatis框架中的精妙应用
设计模式·mybatis·建造者模式
汤姆大聪明1 天前
【软件设计模式】策略模式
设计模式·策略模式
pengzhuofan1 天前
Java设计模式-模板方法模式
java·设计模式·模板方法模式
使二颗心免于哀伤1 天前
《设计模式之禅》笔记摘录 - 17.模板方法模式
笔记·设计模式·模板方法模式
AlenLi2 天前
JavaScript - 观察者模式的实现与应用场景
前端·设计模式