如果类的构造器或者静态工厂中具有多个参数,设计这种类时,应该考虑使用Builder模式。
public class NutritionFacts {
private final int servingSize; // required
private final int servings; // required
private final int colories; // optional
private final int fat; // optional
private final int sodium; // optional
private final int carbohydrate; // optional
public static class Builder {
// required parameters
private final int servingSize;
private final int servings;
// optional parameters
private int colories = 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 setColories(int val) {
this.colories = val;
return this;
}
public Builder setFat(int val) {
this.fat = val;
return this;
}
public Builder setSodium(int val) {
this.sodium = val;
return this;
}
public Builder setCarbohydrate(int val) {
this.carbohydrate = val;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
this.servingSize = builder.servingSize;
this.servings = builder.servings;
this.colories = builder.colories;
this.fat = builder.fat;
this.sodium = builder.sodium;
this.carbohydrate = builder.carbohydrate;
}
}
新建一个NutritionFacts实例:
NutritionFacts nutritionFacts = new NutritionFacts.Builder(240, 8)
.setCarbohydrate(10).build();
Builder模式简化get set方法,只需要定义一个静态公共的内部类即可:
public class User {
private Integer id;
private String name;
private String address;
private User() {
}
private User(User origin) {
this.id = origin.id;
this.name = origin.name;
this.address = origin.address;
}
public static class Builder {
private User target;
public Builder() {
this.target = new User();
}
public Builder id(Integer id) {
target.id = id;
return this;
}
public Builder name(String name) {
target.name = name;
return this;
}
public Builder address(String address) {
target.address = address;
return this;
}
public User build() {
return new User(target);
}
}
UserExample userExample = UserExample.builder()
.id(1)
.name("aaa")
.address("bbb")
.build();
本文介绍如何通过Builder模式简化复杂对象的创建过程,提供两个示例:一个是营养成分信息类NutritionFacts的实现,另一个是User类的实现。
1066

被折叠的 条评论
为什么被折叠?



