package builder;
public class NutritionFacts {
//必选参数
private final int servingSize;
private final int servings;
//可选参数
private final int carlories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder{
//必选参数定义为final,强制其在构造函数是进行初始化
private final int servingSize;
private final int servings;
public Builder(int servingSize,int servings){
this.servingSize=servingSize;
this.servings=servings;
}
//可选参数先给它一个默认的初始值,通过赋值函数可改变它的值
private int carlories=0;
private int fat=0;
private int sodium=0;
private int carbohydrate=0;
public Builder carlories(int val){
this.carlories=val;
return this;
}
public Builder fat(int val){
this.fat=val;
return this;
}
public Builder sodium(int val){
this.sodium=val;
return this;
}
public Builder carbohydrate(int val){
this.carbohydrate=val;
return this;
}
//通过build函数来创建NutritionFacts对象
public NutritionFacts build(){
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder){
servingSize=builder.servingSize;
servings=builder.servings;
carlories=builder.carlories;
fat=builder.fat;
sodium=builder.fat;
carbohydrate=builder.carbohydrate;
}
public static void main(String[] args){
NutritionFacts inst1=new NutritionFacts.Builder(240, 8).
carlories(100).sodium(35).carbohydrate(27).build();
NutritionFacts inst2=new NutritionFacts.Builder(150, 14).fat(50).build();
}
}
Builder模式十分灵活,可以利用单个Builder构建多个对象,builder参数可以在创建对象时进行调整。且这样的代码非常易于阅读。
如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就是不错的选择,特别是当大多数参数都是可选的时候。