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