虽然网上各种模式有多种讲法,但我还是要自己学一遍,写一遍学习心得。
今天看effective java,第二个讲的就是多个参数采用构造器的方法,也就是builder模式。
其实一开始我不是很懂,虽然jdk中好多地方都用了builder模式,现在看着书,有种似曾相识的感觉。
首先有个前提:
所写的bean类中,有n属性。编写这个类时有两种主流方法
①:如果要采用传统的构造器,那就是要写n+1个构造方法,然后再写一堆set和get方法,想想确实有点麻烦。
而且不便于阅读。
②:不提供构造方法,而直接用get和set方法逐一的进行参数值设定。
这样的方式,吧构造过程被分到了几个调用中,很可能是的javabean处于不一致的状态。不能保证一致性。
可能需要程序员付出额外的努力来确保它的线程安全。
那么就进入正题,用builder模式来构造他。
下面先给出一段代码来顺便解释:
/**
* 摘抄自effective java。
* @author U-ANLA
*
*/
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 carbohydrate = 0;
private int sodium = 0;
public Builder(int servingSize,int servings){
this.servings = servings;
this.servingSize = servingSize;
}
public Builder calories(int val){
this.calories = val;
return this;
}
public Builder fat(int val){
this.fat = val;
return this;
}
public Builder carbohydrate(int val){
this.carbohydrate = val;
return this;
}
public Builder sodium(int val){
this.sodium = val;
return this;
}
public NutritionFacts build(){
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder){
this.servingSize = builder.servingSize;
this.calories = builder.calories;
this.servings = builder.servings;
this.fat = builder.fat;
this.carbohydrate = builder.carbohydrate;
this.sodium = builder.sodium;
}
public static void main(String[] args) {
NutritionFacts nutrition = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();
}
}
其实嘛,我觉得一看代码就一目了然了。
与构造器想必,builder的优势在于,有多个可以有多个可变参数,因为都是用单独的方法来设置参数。
builder模式十分灵活,可以利用耽搁builder构建多个对象,
由于builder模式有一个都用到的方法,build,故又可以利用泛型从而写出一个通用的接口。
public interface Builder<T>{
public T build();
}
这样的创建构造器的方法也有缺点,其中一个就是代码冗长,另外,必须先创建一个构造器。
简而言之,如果累的构造器或者静态工厂中具有多个参数,设计这种类时候,builder模式就是一种不错的选择,特别是当
大多数参数都是可选的时候,与传统的重叠构造器模式想必,使用builer模式的客户端代码将更加容易阅读和编写,构造器也比
javabean模式更加安全。