博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java灵活传参之builder模式
阅读量:6588 次
发布时间:2019-06-24

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

问题引入

例如Person类有以下属性:

/** * @author 爱飘de小子 * @date 2018年11月24日 下午2:28:23 * @version 1.0 */@Datapublic class Person {	//必要属性	private String id;	private String name; 	//非必要属性	private String address;	private String gender;	private Integer age;         public Person() {	} 	public Person(String id, String name, String address, String gender, Integer age) {		this.id = id;		this.name = name;		this.address = address;		this.gender = gender;		this.age = age;	}  }复制代码

注: get和set方法采用lombok插件的注解@Data生成(其中无参构造器可以用@NoArgsConstructor注解,有参构造器可以通过@AllArgsConstructor注解生成)

当客户端要创建一个Person实例时,传统的方式会这样创建:

//方式一        Person person = new Person();        person.setId("1");        person.setName("爱飘de小子");         person.setAge(24);        person.setGender("男");         //方式二        Person person2 = new Person("1", "爱飘de小子", null, "男", 24);复制代码

方式一 通过javabeans模式,提供的get和set方法创建实例,创建实例很容易,不足的是代码不够简洁。

方式二 通过构造器创建实例,如果对象的属性较少,这种方式的最优的,如果属性过多,这种方式并对客户端来讲并不友好。

如果使用构造器重载,参数多的情况下,需要重载的构造器个数将会以指数形式增长。

##builder模式 builder模式也叫作重叠构造器模式,改造Person对象如下:

import lombok.Data; /** * @author 爱飘de小子 * @date 2018年11月24日 下午2:28:23 * @version 1.0 */@Datapublic class Person {	//必要属性	private String id;	private String name; 	//非必要属性	private String address;	private String gender;	private Integer age; 	private Person(Builder builder) {		this.id = builder.id;		this.name = builder.name;		this.address = builder.address;		this.gender = builder.gender;		this.age = builder.age;	} 	@Data	public static class Builder {		private String id; 		private String name; 		private String address; 		private String gender; 		private Integer age; 		//必要属性		public Builder(String id,String name) {			this.id = id;			this.name = name;		} 		public Builder setAddress(String address) {			this.address = address;			return this;		}		public Builder setGender(String gender) {			this.gender = gender;			return this;		}		public Builder setAge(Integer age) {			this.age = age;			return this;		}	} }复制代码

注:内部类Builder的setXXX方法每次都返回builder本身,这样保证了Builder模式传参的灵活性。

客户端使用:

Person person = new Person.                Builder("1","爱飘de小子")                .setAddress("成都")                .setAge(24)                .setGender("男")                .build();         Person person1 = new Person                .Builder("2","轮回")                .setAge(21)                .build();复制代码

使用Builder模式相对于构造器的好处是传参灵活,客户端代码简洁,客户端的使用非常方便与易读。

缺点: 1.每次创建Person对象都会创建Builder对象。 2.服务端代码陈余。

转载地址:http://kzrno.baihongyu.com/

你可能感兴趣的文章
如何为CentOS 7配置静态IP地址
查看>>
c:递归算法的三个demo:八皇后问题、台阶问题、汉诺塔
查看>>
Linux-dns基础知识和BIND的简单配置-3(主从DNS服务器及转发)
查看>>
Linux 管道(pipe)原理及使用
查看>>
基于Nginx的Wesocket负载均衡
查看>>
python 函数
查看>>
OAuth2.0介绍
查看>>
"No space left on device" 磁盘空间提示不足解决办法
查看>>
leetcode题解—1021、删除最外层的括号
查看>>
redis主从和持久化
查看>>
【Windows编程】系列第六篇:创建Toolbar与Statusbar
查看>>
Linux篇 | 磁盘存储和文件系统
查看>>
大众点评运维架构图文详解
查看>>
玩转iOS转场动画
查看>>
机房(厂房)温度环境监控系统
查看>>
spark-shell开发wordcount程序
查看>>
DNS正反解析
查看>>
数据库与监控安全
查看>>
算法研发---对宏定义#define相关研究
查看>>
Linux下搭建FTP服务器
查看>>