静态工厂和构造器以及构建器哪个好?
一,先说说他们各自的优缺点
1,静态工厂方法
优势:
1>,有名称,当一个类需要多个带有相同签名的构造器,用工仓方法代替构造器是个好的选择
2>,不必在每次调用他们的时候都创建一个新的对象。
3>,可以返回原返回类型的任何类型的对象。
4>,在创建参数化类型实例的时候,使代码变得更加简洁
2,缺点:
1>,类如果不含有共有的或者受保护的构造器,就不能被子类化。
2>,它们与其他的静态方法实际上没有任何区别。
二, 遇到多个构造器参数时考虑用构建器
why?
reason:
静态工厂和构造器都有一个局限性:他们都不能很好滴扩展到大量的可选参数
考虑用一个类表示包装食品外面现实的营养成分标签,这些标签中有几个域时必须的:每份的含量\每罐的含量、以及每份的卡路里,还有超过20个可选域:总脂肪量、饱和脂肪量、转化脂肪、胆固醇、钠等等。大多数产品在某几个可选域中都会有非零的值。
public class NutritionFacts {
private final int servingSize = 0; //必须
private final int servings= 0; //必须
private final int calories= 0; //非必须
private final int fat= 0; //非必须
private final int sodium= 0; //非必须
private final int carbohydrate= 0; //非必须
public static class Builder{
private int servingSize = 0; //必须
private int servings =0; //必须
private int calories = 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 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);
}
public NutritionFacts(Builder builder){
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat =builder.fat;
carbohydrate = builder.carbohydrate;
sodium = builder.sodium;
}
}
public static void main(String[] args) {
NutritionFacts nutritionFacts = new Builder(240,8).calories(100).sodium(35).carbohydrate(27).build();
}
}