应用场景
如果需要根据多个不同的参数来创建某类的不同对象,很常见的方法是定义多个构造器以供不同场合下的调用。但有一种更好的构造方法,我们可以使用Builder模式来实现(前提是多个构造参数)。
示例(汽车类及其Builder构造器)
public class Car {
private final int seet;
private final String engine;
private final int dormer;
private final int speed;
private final int color;
public static class Builder{
private int seet;
private String engine;
// Optional parameters
private int dormer;
private int speed;
private int color;
public Builder(int seet, String engine){
this.seet = seet;
this.engine = engine;
}
public Builder dormer(int val){
this.dormer = val;
return this;
}
public Builder speed(int val){
this.speed = val;
return this;
}
public Builder color(int val){
this.color = val;
return this;
}
public Car build(){
return new Car(this);
}
};
private Car(Builder builder){
this.seet = builder.seet;
this.engine = builder.engine;
this.dormer = builder.dormer;
this.speed = builder.speed;
this.color = builder.color;
}
}
演示制造汽车过程(不同的汽车需要不同的部件):
public class Main {
public static void main(String[] args) {
Car car1 = new Car.Builder(4, "power").dormer(1).speed(1000).color(255).build();
Car car2 = new Car.Builder(2, "awesome").speed(2000).color(122).build();
}
}
这样自由组合的不停的build,是不是有点酷?
延伸
为实现更好的伸缩性,Builder类可独立出来,并且继承于某个Builder接口。另外,从上例可以看出,Builder重定义了一遍Car类的属性,其实现是需要消耗一定的性能的;所以当可选参数较少时,并不建议使用这样的Builder模式。