一般创建实例的方法
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模式性能开销可能大一些,而且代码量看起来也挺长的,、
适用于可选参数特别多的情况