构建器Builder
在构造对象时,Builder模式既能保证像重叠构造器模式那样的安全性,也能保证像JavaBeans模式那么好的可读性。它不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象。然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数。最后,客户端调用无参的build方法来生成不可变的对象。Builder模式通常用于创建不可变对象,保证线程安全。
Demo
public class NutritionalFacts {
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 int getServingSize() {
return servingSize;
}
public int getServings() {
return servings;
}
public int getCalories() {
return calories;
}
public int getSodium() {
return sodium;
}
public int getFat() {
return fat;
}
public int getCarbohydrate() {
return carbohydrate;
}
public static class Builder {
private int servingSize;
private int servings;
private int calories;
private int fat;
private int sodium;
private int carbohydrate;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) {
this.calories = val;
return this;
}
public Builder sodium(int s) {
this.sodium = s;
return this;
}
public Builder fat(int f) {
this.fat = f;
return this;
}
public Builder carbohydrate(int c) {
this.carbohydrate = c;
return this;
}
public NutritionalFacts build() {
return new NutritionalFacts(this);
}
}
private NutritionalFacts(Builder builder) {
this.servingSize = builder.servingSize;
this.servings = builder.servings;
this.calories = builder.calories;
this.sodium = builder.sodium;
this.fat = builder.fat;
this.carbohydrate = builder.carbohydrate;
}
@Override
public String toString() {
return "NutritionalFacts{" + "servingSize=" + servingSize + ", servings=" + servings + ", calories=" + calories
+ ", fat=" + fat + ", sodium=" + sodium + ", carbohydrate=" + carbohydrate + '}';
}
}
public class BuildDemo {
public static void main(String[] args) {
NutritionalFacts nutritionalFacts
= new NutritionalFacts.Builder(240, 9).calories(200).sodium(20).fat(34).calories(23).build();
System.out.println(nutritionalFacts);
}
}