Builder模式

来源:互联网 发布:激战2马乔丽捏脸数据 编辑:程序博客网 时间:2024/04/30 22:11
/** *  * @author luoaz * */public class InstanceCanNotChange {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 parametersprivate int servingSize;private int servings;// Optional parameters - initialized to default valuesprivate 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 calories) {this.calories = calories;return this;}public Builder fat(int fat) {this.fat = fat;return this;}public Builder sodium(int sodium) {this.sodium = sodium;return this;}public Builder carbohydrate(int carbohydrte) {this.carbohydrate = carbohydrte;return this;}public InstanceCanNotChange builder() {return new InstanceCanNotChange(this);}}private InstanceCanNotChange(Builder builder) {this.servingSize = builder.servingSize;this.servings = builder.servings;this.calories = builder.calories;this.fat = builder.fat;this.sodium = builder.sodium;this.carbohydrate = builder.carbohydrate;}}

优点:安全

与构造器相比,builder的微略优势在于,builder可以有多个可变参数。构造器就像方法一样,只能有一个可变参数。因为builder利用单独的方法来设置每个参数,你想要多少可变参数,它们就可以有多少个可变参数,直到每个setter方法都有一个可变参数。Builer模式十分灵活,可以利用单个builder构建多个对象。builder的参数可以在创建对象期间进行调整,也可以随着不同的对象而改变。builder可以自动填充某些域,例如每次创建对象时增加序列号

缺点:builder模式也有它自身的不足。为了创建对象,必须先创建它的构造器。虽然创建构建器的开销在实践中可能不是那么明显,但是在某些十分注重性能的情况下,可能就成问题了。Builder模式还比重叠构造器模式更加冗长,因此它只在有很多参数的时候才使用,比如4个或更多参数。但是记住,将来你可能需要添加参数。如果一开始就使用构造器或者静态工厂,等到类需要多个参数时才添加构建器,就会无法控制,那些过时的构造器或者静态工厂显得十分不协调。因此,通常最好一开始就使用构建器

简而言之:如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就是种不错的选择,特别是当大多数参数都是可选的时候。与使用传统的重叠构造器模式相比,使用Builder模式的客户端代码更易于阅读和编写,构造器也比JAVABEANS更安全。


摘抄自:Effective Java

原创粉丝点击