Point2 Builder构造器创建实例
如果一个类的构造器或者工厂模式中存在多个参数,此时相对于重载构造器或者JavaBeans模式(parameters-set)方法,Builder构造器(建造者模式的一种表现形式)是一种不错选择!
例如此时存在一个NutritionFacts类,包含以下属性:
- servingSize 摄入量
- servings 分量
- calories 卡路里
- sodium 纳
- fat
- carbohydrate 糖分
我们可以通过设计Builder构造器来实现NutritionFacts类的实例的快捷、方便、不冗余创建
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 {
private final int servingSize;
private final int servings;
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
//Builder构造器
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);
}
}
//NutritionFacts的私有构造器
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
@Override
public String toString() {
return "NutritionFacts{" +
"servingSize=" + servingSize +
", servings=" + servings +
", calories=" + calories +
", fat=" + fat +
", sodium=" + sodium +
", carbohydrate=" + carbohydrate +
'}';
}
}
此时,我们可以通过如下代码创建NutritionFacts的实例对象
NutritionFacts nutritionFact = new NutritionFacts.Builder(240, 80).calories(100).sodium(35).fat(50).
carbohydrate(35).build();
System.out.println(nutritionFact);
//输出如下
NutritionFacts{servingSize=240, servings=80, calories=100, fat=50, sodium=35, carbohydrate=35}