定义
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(如何一步一步创建一个包含多个组件的对象)。
- 用户只需要指定建造的类型,就可以得到它们,建造过程及细节不需要知道
适用场景
- 一个对象,构造方法参数特别多。可以考虑使用建造者模式,将构建与表示分离,减少构造方法的参数。
链式实现
下面是 建造者模式链式实现
的代码,省略了getter和setter。
// 使用建造者模式实现Computer的实例化
// 如果使用构造方法初始化,参数将有5个,会使构造方法的使用过于复杂
public class Computer {
private String cpu;
private String ram;
private int usbCount;
private String keyboard;
private String display;
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.usbCount = builder.usbCount;
this.keyboard = builder.keyboard;
this.display = builder.display;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", usbCount=" + usbCount +
", keyboard='" + keyboard + '\'' +
", display='" + display + '\'' +
'}';
}
public static class Builder {
private String cpu;
private String ram;
private int usbCount;
private String keyboard;
private String display;
public Builder setCpu(String cpu) {
this.cpu = cpu;
return this;
}
public Builder setRam(String ram) {
this.ram = ram;
return this;
}
public Builder setUsbCount(int usbCount) {
this.usbCount = usbCount;
return this;
}
public Builder setKeyboard(String keyboard) {
this.keyboard = keyboard;
return this;
}
public Builder setDisplay(String display) {
this.display = display;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
实例化 Computer
代码:
Computer pc = new Computer.Builder()
.setCpu("i7")
.setRam("16GB")
.setUsbCount(2)
.setKeyboard("cherry")
.setDisplay("dell 27inch")
.build();
System.out.println(pc);
建造者模式在开源代码中的使用:
- Spring: BeanDefinitionBuild
- Mybatis: SqlSessionFactoryBuilder