遇到多个构造器参数时考虑用构建器
Builder模式适合类有很多可选构造参数时。
如果类有很多参数,而且这些参数可选时,在初始化时就会比较麻烦。如果用构造函数,要写很多个,而且可能传入我们不想传入的参数。而JavaBean,构造过程会被分到几个调用中,在构造过程中javabean可能处于不一致的状态。
关于这个不一致我也不是很理解。希望有懂得帮忙解释下。特地用sublime手打了一遍builder模式加深印象。
//Builder Pattern
public class NutritionFacts{
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohhydrate;
public static class Builder{
//Required parameters
private final int servingSize;
private final int servings;
//Optional patameters-initialized to default values
private int calories =0;
private int fat =0;
private int carbohhydrate=0;
private int sodium =0;
public Builder(int servingSize,int servings){
this.servingSize=servingSize;
this.servings=servings;
}
public Builder calories(int val){
this.calories=val;
return this;
}
public Builder fat(int val){
this.fat=val;
return this;
}
public Builder carbohhydrate(int val){
this.carbohhydrate=val;
return this;
}
public Builder sodium(int val){
this.sodium=val;
return this;
}
public NutritionFacts build(){
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder){
servingSize=builder.servingSize;
servings=builder.servings;
fat=builder.fat;
sodium=builder.sodium;
carbohhydrate=builder.carbohhydrate;
calories=builder.calories;
}
public void printInfo(){
System.out.println("servingSize:"+servingSize);
System.out.println("servings:"+servings);
System.out.println("fat:"+fat);
System.out.println("sodium:"+sodium);
System.out.println("carbohhydrate:"+carbohhydrate);
System.out.println("calories:"+calories);
}
}
调用方法
public class BuilderPatternEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
NutritionFacts nutrition=new NutritionFacts.Builder(204, 6).calories(6).build();
nutrition.printInfo();
}
}
这样在构造时候,就可以单个赋值而且构造过程不会被拆开。但是无疑代码量加大了。而且创建Builder构造器还增加了花销,虽然增加的也不多。