要求创建一个实例,包含多个必选的参数和多个可选参数
###方法一
习惯采用重叠构造器模式,即提供多个参数不同的构造方法,然后根据需要选择相应的构造方法创建实例。但是当有许多参数的时候,代码就很难编写,并难以阅读
###方法二
JavaBeans模式,用一个无参构造器来创建对象,然后调用setter方法来设置每一个必要的参数,及可选参数。这样产生的代码读起来很容易,但是本身有着严重的缺点:在构造过程中JavaBeans可能处于不一致的状态。
###方法三
既能保证重叠构造器模式那样的安全性,也能保证JavaBeans模式那样的可读性–Builder模式,下面直接贴示例代码
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 carbohydrate;
public static class Builder {
//Required parameters
private final int servingSize;
private final int servings;
//Optional parameters - initialized to default values
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) {
calories = val;
return this;
}
public Builder fat(int val) {
fat = val;
return this;
}
public Builder sodium(int val) {
sodium = val;
return this;
}
public Builder carbohydrate(int val) {
carbohydrate = val;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
然后调用的时候,就直接像下面那样使用:
NutritionFacts cocaCola = new NutritionFacts.Builder(200, 8).calories(100).sodium(36).carbohydrate(25).build();
Builder模式十分灵活,可以利用单个builder构建多个对象。builder的参数可以在创建对象期间进行调整,也可以随着不同的对象而改变。