一般创建实例的方法
1. 构造方法
2.静态工厂方法
3.构建器
当使用构造器或者静态工厂方法时,创建类的实例不能很好的用于大量的可选参数,类似于有的参数是必须的,有个往往要根据可选参数设置默认值,不同的构造方法。
这是我们一般习惯使用的重叠构造器*telecoping constructor模式,
通过使用JavaBean模式,可以改进这种类的构造方法,使用默认的构造方法,设置不同的参数,但是该模式有很大的缺点,因为构造器被分配到不同的构造过程,导致JavaBean可能处于不一致的状态,特别的不适合用于多线程操作,导致类变得可变。
第三中方法通过构建器,Builder模式,不直接生成想要的对象,而是通过让客户端利用所有必要的参数调用构造器,得到一个builder对象,然后客户端在builder对象上调用类似于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 paramters-initialized to default values;
private int calories=0;
private int fat=0;
private int carbohydrate=0;
private int 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){
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){
servingSize=builder.servingSize;
servings=builder.servings;
calories=builder.calories;
fat=builder.fat;
sodium=builder.sodium;
carbohydrate=builder.carbohydrate;
}
public static void main(String[] args){
NutritionFacts instance=new NutritionFacts.Builder(240, 8).calories(2).build();
}
}
Builder模式性能开销可能大一些,而且代码量看起来也挺长的,、
适用于可选参数特别多的情况