Builder模式

使用场景:当创建一个对象时,有多个参数需要设置,有些参数是必须的,而有些是可选的。我们常见的方式是通过写多个重载构造器,构造器的参数个数逐个递增,参数少的构造器通过this调用其它构造器,形式如下:

public class NutritionFacts {
private final int servingSize;
// required
private final int servings;
// (per container) required
private final int calories;
//optional
private final int fat;
//optional
private final int sodium;
optional
private final int carbohydrate; 
//optional
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories) {
this(servingSize, servings, calories, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories, int fat) {
this(servingSize, servings, calories, fat, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories, int fat, int sodium) {
this(servingSize, servings, calories, fat, sodium, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories, int fat, int sodium, int carbohydrate) {
this.servingSize = servingSize;
this.servings
= servings;
this.calories
= calories;
this.fat
= fat;
this.sodium
= sodium;
this.carbohydrate = carbohydrate;
}
}

像上面的做法直接导致的问题是构造器参数过多,代码可读性和易用性差,容易导致客户端程序调用时产生问题,假如当参数类型都相同时,很容易导致传入参数顺序写错而编译通过。

另一种做法是使用JavaBean模式,就是通过许多setter方法设置对象内部的数据值,这种方法在J2EE开发时比较常见,相信做过这方面开发的人都很了解,我就不写代码例子了。JavaBean模式也不是一种好的方法,过多的setter导致代码的可读性下降。

当创建对象的参数过多,而有些是可选的时候最好的办法是使用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
private int
private int
private int
private int
parameters - initialized to default values
calories= 0;
fat= 0;
carbohydrate = 0;
sodium= 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 carbohydrate(int val)
{ carbohydrate = val; return this; }
public Builder sodium(int val)
{ sodium = 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;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值