博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
笔记:创建对象的Builder模式
阅读量:5144 次
发布时间:2019-06-13

本文共 2861 字,大约阅读时间需要 9 分钟。

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 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/dingbbww/p/9347001.html

你可能感兴趣的文章
Linux环境下Redis安装和常见问题的解决
查看>>
HashPump用法
查看>>
cuda基础
查看>>
Vue安装准备工作
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
LibSVM for Python 使用
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
CSS属性值currentColor
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
解决ajax请求cors跨域问题
查看>>
《收获,不止Oracle》pdf
查看>>
LinkedList<E>源码分析
查看>>
Real-Time Rendering 笔记
查看>>
如何理解HTML结构的语义化
查看>>
Activity之间的跳转:
查看>>
实验四2
查看>>
Android现学现用第十一天
查看>>