介绍:
如果一个对象的创建拥有很复杂的流程,或对象内存在很多组件、属性等,使用建造者模式将这种对象的创建和使用分离。该模式可以使用固定的组件但不同的顺序去建造不同的对象,如炒一个菜韭菜鸡蛋,韭菜(组件1)和鸡蛋(组件2)是一定要放的,但放的顺序可以不同;同样组件1也可以是番茄,组件2也可以是其他东西,由具体的build类去指定,而组件的安装顺序则由执行者去指定,客户端只需要从执行者处拿到对象即可。
优点:
- 能够创建很复杂、流程组件很多的对象。
缺点: - 会产生额外的build对象,当产品内部结构发生改变时,建造者工厂需要改变。
源码举例
- JDK中的StringBuilder和StringBuffer
- guava中的immutableset和cachebuilder
- spring中的beanDefinitionBuilder
- mybatis的sqlsessionfactorybuilder
代码
public class Computer {
private String CPU;
private String memory;
private String GPU;
}
public interface BuilderFactory {
void buildCPU();
void buildMemory();
void buildGPU();
Computer buildComputer();
}
public class InterBuilderFactory implements BuilderFactory{
Computer inter = new Computer();
@Override
public void buildCPU() {
inter.setCPU("安装inter CPU");
}
@Override
public void buildMemory() {
inter.setMemory("安装inter 内存条");
}
@Override
public void buildGPU() {
inter.setGPU("安装inter 显卡");
}
@Override
public Computer buildComputer() {
return inter;
}
}
public class Actor {
BuilderFactory factory = new InterBuilderFactory();
public Computer getInter(){
factory.buildMemory();
factory.buildGPU();
factory.buildCPU();
return factory.buildComputer();
}
}
public class Test {
public static void main(String[] args) {
Actor actor = new Actor();
Computer computer = actor.getInter();
//Computer{CPU='安装inter CPU', memory='安装inter 内存条', GPU='安装inter 显卡'}
System.out.println(computer.toString());
}
}
升级为链式调用
public class Computer {
private String CPU;
private String memory;
private String GPU;
public Computer(ComputerBuilder builder) {
this.CPU=builder.getCPU();
this.GPU=builder.getGPU();
this.memory=builder.getMemory();
}
public Computer() {
}
public static class ComputerBuilder{
private String CPU;
private String memory;
private String GPU;
public ComputerBuilder buildCPU() {
this.setCPU("安装inter CPU");
return this;
}
public ComputerBuilder buildMemory() {
this.setMemory("安装inter 内存条");
return this;
}
public ComputerBuilder buildGPU() {
this.setGPU("安装inter 显卡");
return this;
}
public Computer build(){
return new Computer(this);
}
}
}
public Computer getInterBuilder(){
Computer computer = new Computer.ComputerBuilder().buildCPU().buildGPU().buildMemory().build();
return computer;
}