概念
将一个复杂对象的创建过程拆解成多个小步骤,然后一步步构建出来。定义各种建造者或通过指挥者指挥建造者按照不同方式建造出各种产品
应用场景
1)当需要生产一种产品,由多个部分或步骤构成,且不同变种的产品需要不同的部分或步骤。
2)当需要构造的对象具有冗长的构造参数,可以使用建造者模式灵活拼接参数,避免构造方法过长或参数顺序混乱

基本结构

1)产品类(Product):要构建的复杂对象,包含多个组成部分
2)抽象建造者类(Builder):定义构建产品各个部分的抽象方法,以及返回最终产品的方法
3)具体建造者类(ConcreteBuilder):实现Builder接口,具体负责各个部分的构建细节,并最终组装出完整产品
4)指挥者类(Director):指挥不同的建造者按照一定步骤来构建产品,屏蔽了构建过程的细节
5)客户端类(Client):发起建造请求,选择具体的建造者并使用指挥者来完成产品的创建
代码实现
以“电脑组装”来演示
定义产品类
表示最终要构建的复杂对象
@Data
public class Computer {
private String cpu;
private String memory;
private String hardDisk;
private String gpu;
}
定义抽象建造者
定义了产品构造的各种步骤或组件,交由子类实现
定义返回最终产品的方法
public abstract class ComputerBuilder {
protected Computer computer = new Computer();
public abstract void buildCpu();
public abstract void buildMemory();
public abstract void buildHardDisk();
public abstract void buildGpu();
public Computer getResult() {
return computer;
}
}
定义具体建造者
隔离的实现建造的每一个部分。
可以定义不同建造者,实现建造不同产品。
public class GamingComputerBuilder extends ComputerBuilder {
@Override
public void buildCpu() {
computer.setCpu("Intel i9");
}
@Override
public void buildMemory() {
computer.setMemory("32GB DDR5");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("1TB NVMe SSD");
}
@Override
public void buildGpu() {
computer.setGpu("NVIDIA RTX 4090");
}
}
定义指挥者
这里通过定义多种建造方法construct(),实现指挥建造者建造出多种产品
public class Director {
private ComputerBuilder builder;
public Director(ComputerBuilder builder) {
this.builder = builder;
}
public Computer construct() {
builder.buildCpu();
builder.buildMemory();
builder.buildHardDisk();
builder.buildGpu();
return builder.getResult();
}
}
客户端调用
为指挥者提供建造者,调用需要的建造方法
public class Main {
public static void main(String[] args) {
ComputerBuilder builder = new GamingComputerBuilder();
Director director = new Director(builder);
Computer gamingPc = director.construct();
System.out.println(gamingPc);
}
}
优缺点
优点
1)便于构建“不同版本”的对象:通过不同的建造者,可以轻松地创建出结构类似但配置不同的对象
2)易于维护和扩展:把构建逻辑从产品本身抽离出来,符合单一职责原则,既减少了耦合,也让代码更容易维护
缺点
1)不适合构建过程差异太大的对象:建造者模式适合用在“有共同构建步骤”的对象上。如果对象之间的构建逻辑完全不一样,硬套建造者反而会让代码变得臃肿、不灵活
