Builder 模式

来源:互联网 发布:手机照相摄像软件 编辑:程序博客网 时间:2024/06/18 11:34

Builder 模式

@(博客文章)[java]

参考《effetive java》
详细代码请见

当一个类中有很多属性,而且大部分属性为空时,如果要为这个类提供一个完整属性列表的构造函数的话,会使用这个类被调用时需要提供所有的参数,这会非常的麻烦。因为大部分属性都是为空的。

或者可以提供多个构造函数,分别适配不同的情形,但这样的话会导致构造函数非常多,而且调用这些构建函数时很容易混淆不同的参数(特别是这些参数有相同的类型)。

而Builder模式可以解决以上问题,它通过一个Builder类来构造一个对象,而不是以这个类的构造函数,同时以各种各样的setter方法对需要更改默认属性的进行设置。

下面的例子中,以一个person类为例,它的name属性是必选的,其它为可选。以下代码的输出为:ljh5113579246810unkowngz

/** *  */package org.ljh.javademo.builderpatter;/** * date: 2016年3月4日 下午4:00:22 *  * @author LUJINHONG lu_jin_hong@163.com Function: TODO ADD FUNCTION. last *         modified: 2016年3月4日 下午4:00:22 */public class Person {    private final String name;    private final int age;    private final int gender;    private final String phoneNum;    private final String email;    private final String city;    private Person(Builder builder) {       name = builder.name;       age = builder.age;       gender = builder.gender;       phoneNum = builder.phoneNum;       email = builder.email;       city = builder.city;    }    //Person类的其它公有方法,还可以有walk(), run(), eat()等。    public String getMessage(){        return name + age + gender + phoneNum + email + city;     }    public static class Builder {        private String name;        private int age = -1;        private int gender = 1;        private String phoneNum = "unkown";        private String email = "unkown";        private String city = "unkown";        public Builder(String name) {            this.name = name;        }        public Person build(){            return new Person(this);        }        public Builder age(int age) {            this.age = age;            return this;        }        public Builder gender(int gender) {            this.gender = gender;            return this;        }        public Builder phoneNum(String phoneNum) {            this.phoneNum = phoneNum;            return this;        }        public Builder email(String email) {            this.email = email;            return this;        }        public Builder city(String city) {            this.city = city;            return this;        }    }    //通过会有其它类中进行调用,这是为了方便,在本类中进行demo调用。    public static void main(String[] args){            Person ljh = new Person.Builder("ljh").age(5).gender(1).phoneNum("13579246810").city("gz").build();            System.out.println(ljh.getMessage());    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 扣扣密码忘了手机号换了怎么办 如何更改微信登录密码忘记了怎么办 阿里卖家不肯同意退货退款怎么办 新买的号码被绑定微信怎么办 如果换手机原来旧手机支付宝怎么办 支付宝注册证件已过有效期怎么办 支付宝账号是手机号换号怎么办 淘宝网卖假药伤了别人身体怎么办 微信手机登录收不到验证码怎么办 淘宝店的宝贝没有尺码选项怎么办 淘宝账号被保护要自助开通怎么办 小米平板经常出现系统无响应怎么办 淘宝买家被取消运费险了怎么办 新开的淘宝直播店没有流量怎么办 淘宝买的东西一直不发货怎么办 在淘宝上买了东西不发货怎么办 宝贝好几天拉一次吃的也少怎么办 淘宝快递正在运输途中想退货怎么办 淘宝买的东西退货商家拒收怎么办 手机屛上出现了微信图标怎么办 手机用了两年了反应太慢怎么办 魅族手机显示手机已锁定怎么办 为什么微信注册要安全验证码怎么办 微信帐号异常无法领取红包怎么办 帮朋友代付在支付宝被骗怎么办 商家说未收到货拒绝退款怎么办 淘宝商家拒绝退款怎么办还没收货的 拼多多点错确认收货了怎么办 被别人用菜刀砍伤没钱看病怎么办 东京下了订单但不发货怎么办 绑定卷皮钱包的手机号码丢了怎么办 小孩回奶在垫的被子上发霉了怎么办 2个月宝宝不喝母乳只喝奶瓶怎么办 我的扣扣被盗了朋友别被骗了怎么办 我买的股票退市了我的钱怎么办啊 在美食林被门口买宝石的骗了怎么办 在商场买的彪马鞋子皮子裂了怎么办 手机换号了京东钱包里的余额怎么办 寄报销发票给顺丰快递搞丢了怎么办 物流显示揽件但把快递弄丢了怎么办 在李宁商城上买的东西丢了怎么办