Effective Java一书中说到既能保证想重叠构造器模式那样的安全性,也能保证像JavaBean模式那么那么好的可读性.这就是Builder模式的一种形式.
不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(静态工厂),得到一个builder对象,然后客户端在builder对象中调用类似于setter到的方法.来设置每个相关的可选参数.最后,客户端调用无参的builder方法来生成不可变的对象.这个builder是它构建的类的静态成员类.如下代码:
/** * builder模式:不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象 * 然后客户端在builder对象上调用类似的setter的方法,来设置每个相关的可选参数。最后,客户端调用无参的build方法来生成不可变的对象 * 这个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; //构建静态内部类的builder 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 val){ calories = val; return this; } public Builder fat(int val){ fat = val; return this; } public Builder sodium(int val){ sodium = val; return this; } public Builder carbohydrate(int val){ carbohydrate = 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; } @Override public String toString() { return "NutritionFacts [servingSize=" + servingSize + ", servings=" + servings + ", calories=" + calories + ", fat=" + fat + ", sodium=" + sodium + ", carbohydrate=" + carbohydrate + "]"; } }
调用去创建这个对象
public class Demo { public static void main(String[] args) { NutritionFacts nu = new NutritionFacts.Builder(1, 2).calories(3).carbohydrate(4).fat(5).sodium(6).build(); System.out.println(nu.toString()); }}
最后的得到的结果:
NutritionFacts [servingSize=1, servings=2, calories=3, fat=5, sodium=6, carbohydrate=4]
当在有许多参数的情况下,这样就可以达到在创建对象时可以在某几个可选域中灵活的添加参数.当大多数参数都是可选的时候,与传统的重叠构造器模式相比,使用Builder模式的客户端代码更易于阅读和编写,构造器也比JavaBean更加安全.
posted on 2018-07-21 16:16 阅读( ...) 评论( ...)