学习总结:java构建器模式

来源:互联网 发布:美国西密歇根大学 知乎 编辑:程序博客网 时间:2024/06/04 00:59

如何构造有大量可选参数的对象?


重叠构造器:可行,但构造函数太多,代码很难编写,切难以阅读。


javaBeans模式(调用一个无参构造器创建对象,调用setter方法设置每个参数):弥补重叠构造器的不足,但是构造时会产生不一致的状态(一个只设置了A属性,另一个只设置了B属性,不能确定必选参数都设置了),造成调试困难;并且把类变成可变的,设置一个属性后,还能再设置一遍来改变原属性。


Java构建器:不直接生成想要的对象,利用必要的参数调用构造器,得到builder对象,在builder对象上调用类似setter方法,设置每个可选参数,最后,调用无参的build方法生成不可变的对象,这个build是它构建的类的静态成员类。

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 sodium=0;private int carbohydrate=0;/* * 不直接生成想要的对象,利用必要的参数调用构造器 */public Builder(int servingSize,int servings){this.servingSize=servingSize;this.servings=servings;}/* * 调用类似setter方法,设置每个可选参数 */public Builder calories(int cal){calories=cal;return this;}public Builder fat(int fa){fat=fa;return this;}public Builder sodium(int so){sodium=so;return this;}public Builder carbohydrate(int car){carbohydrate=car;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;}}
调用方法:

NutritionFacts nur=new NutritionFacts.Builder(7,12).calories(5).fat(9).sodium(23).carbohydrate(88).build();


android 中 okhttp 的Request方法类似。


原创粉丝点击