设计模式4-建造者模式
定义
Builder Partern:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(针对于构建对象的参数众多而提出的解耦合,创造复杂对象)
目的
● 使参数更加可视化和可以明确各个参数的定义
● 定义规范和约束
场景
● 当构建一个类的参数众多避免参数混乱时,可以使用建造者模式
实际使用
●java.lang.StringBuilder
和 java.lang.StringBuffer
:append()
方法返回自身,类似于建造者的链式调用。
●java.util.stream.Stream.Builder
代码
// 产品类 - 计算机
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);}}@Overridepublic 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);}
}
建造者模式代码