Builder 模式
Builder 模式
@(JAVA)[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());}
}
Builder 模式相关推荐
- Java 常用设计模式 -- Builder模式
Builder模式是在Java中最流行的模式之一.它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例. 模式的流畅变体 ...
- Creational模式之Builder模式
1.意图 将一个复杂对象的构建与它表示分离,使得相同的构建过程能够创建不同的表示. 查看很多其它请点击 2.别名 无 3.动机 一个RTF(Rich Text Format)文档交换格式的阅读器应能将 ...
- 可扩展性的builder模式的构建方法
http://www.cnblogs.com/happyhippy/archive/2010/09/01/1814287.html 使用builder模式的时候: 本篇文章的原因:builder模式接 ...
- GOF对Builder模式的定义(转载)
(1)意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. (2)适用性 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式: 2. 当构造过程必须允许 ...
- 创建型模式之Builder模式
1.意图 将一个复杂对象的创建与它的表示分享,使得同样的构建过程可以创建不同的表示. 2.适用性 (1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时 (2)当构造过程必须允许被构 ...
- java设计模式:Builder模式
Builder模式关键是在建立对象是一步一步处理 package customer;class Starbucks {private String size;private String drink; ...
- JAVA Builder模式构建MAP/LIST的示例
我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import j ...
- 设计模式-Builder模式
目录 一个例子(做汤) 人工做汤 机器做汤(使用Builder模式) 优缺点 优点 缺点 Builder模式属于创建型模式. 它是将一个复杂对象的构建过程隐藏起来,让使用者只关系自己要生成什么样的对象 ...
- Intellij idea generate builder 插件-用于自动生成builder模式代码
2019独角兽企业重金招聘Python工程师标准>>> 目的:开发中喜欢builder模式去构造一个实例,而当一个对象的属性过多的时候,手动的去完成一个类的builder是很繁琐的: ...
- java的设计模式 - Builder模式
Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...
最新文章
- 自动驾驶领域大佬在CVPR2020中 关于3D Reconstruction Learning的报告
- 这样去写你的 HTML
- Tomcat、JDK 历史版本下载地址
- 论文学习20-End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF(序列标注,2016ACL
- ansible的介绍
- 2017 Multi-University Training Contest - Team 3 Kanade's trio(字典树+组合数学)
- 小学数学测试软件前言,小学数学教学案例集序言.docx
- 凝胶渗透色谱的基本概念(一)
- jqGrid设置三级表头和表头合并
- SAAS 技术栈回顾
- 离线语音交互技术路线之语音合成(TTS)篇
- PostgreSQL 15 新特性解读 | 墨天轮优质文章合集
- 百度Q-T语义一致性比未获奖 (总结)
- Redis缓存击穿、雪崩、穿透!(超详细)
- JAVA基础知识-集合
- Spinner ArrayAdapter
- Double-checked locking should not be used
- 连接linux的SSH工具(finalxshell,xshell等)
- 记kali系统中下载百度网盘中文件的方法(一) BND
- MQTT.fx客户端使用方法
热门文章
- CommonJS概述及使用
- 【三万字!】Dubbo、Zookeeper学习笔记!秒杀面试官!——双非上岸阿里巴巴系列
- 【简便解法】1084 外观数列 (20分)_24行代码AC
- 大数系列三——斐波那契数列——高效万进制,亿进制
- idea新建springboot后端到前端_码云开源项目:利用SpringBoot+Vue 实现留言版
- python中元组可以比较大小吗_python元组比较
- win10远端服务器未响应,win10怎么连远程服务器未响应
- 12 c for. oracle rac,【案例】Oracle RAC FOR AIX搭建执行root.sh时两次报错的解决办法
- 中如何调取api_API(接口)是什么
- python legend位置_关于matplotlib-legend 位置属性 loc 使用说明