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