考虑采用静态工厂方法代替构造器
public class Coca {
private final int carbohydrate;
private final int calories;
private final int fat;
private final int sugar;
private Coca(int carbohydrate, int calories, int fat, int sugar) {
this.carbohydrate = carbohydrate;
this.calories = calories;
this.fat = fat;
this.sugar = sugar;
}
public static Coca includeAllCoca(int carbohydrate, int calories, int fat, int sugar) {
return new Coca(carbohydrate,calories,fat,sugar);
}
public static Coca noFat(int carbohydrate, int calories, int sugar) {
return new Coca(carbohydrate,calories,0,sugar);
}
public static Coca noSugar(int carbohydrate, int calories, int fat) {
return new Coca(carbohydrate,calories,fat,0);
}
}
优点1:静态工厂方法的名字由自己命名,而构造方法必须与类名相同
假如我们想要提供多个具有相同签名的构造器,这在Java中是做不到的,除非把参数列表的顺序做些调整,但这会对用户很不友好。
因此可以使用静态工厂方法,取不同的名字以表示不同的构造方式。
适用于类中含有多个构造器的情况,可以通过准确命名的静态方法返回我们需要的对象
优点2:构造方法每次调用都会创建一个对象,而静态工厂方法则不会每次调用时都创建要给对象。
适用于单例模式。
优点3:静态工厂方法可以返回原返回类型的任何子类型对象,这样在我们选择返回对象的类时就有了更大的灵活性
运用到了多态
缺点:
a. 类如果不含有公有的类或者受保护的构造器,就不能被子类化
b. 它们与其他的静态方法实际上没什么区别,因此我们约定了一些静态工厂方法的常用名称