起因:最近在做统计计算,创建的实体中属性比较多,都是一些数值,一开始是通过get、set方法进行赋值,占用了很多业务代码方法的长度,可读性不太好,后来改用了添加构造器的方式,稍显精简了一点,但是每次赋值的时候都都必须注意是不是对应上了。最后决定改用Bulider模式,确实好用很多。

下面通过一个实际的demo看一下效果

package com.github.xsh.demo.model;

    /**
* @description:
* @date: 2019/5/16
**/
public class Student { private int id; private String name; private String passwd; private String sex; private String address; private Student(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.passwd = builder.passwd;
this.sex = builder.sex;
this.address = builder.address;
} /**
* Builder
*/
public static class Builder {
private int id;
private String name;
private String passwd;
private String sex;
private String address; public Builder(int id, String name) {
this.id = id;
this.name = name;
} public Builder passwd(String passwd) {
this.passwd = passwd;
return this;
} public Builder sex(String sex) {
this.sex = sex;
return this;
} public Builder address(String address) {
this.address = address;
return this;
} public Student build() {
return new Student(this);
}
} @Override
public String toString() {
return String.format("%s[id=%s, name=%s, passwd=%s, sex=%s, address=%s]",
getClass().getSimpleName(), id, name, passwd, sex, address);
} //为了使阅读简洁,此处省略getter setter } @Test
public void buliderTest(){
Student student = new Student.Builder(1,"jack")
.sex("男士")
.address("地球村")
.passwd("1232")
.build();
//先填充属性再构建除对象,看上去是不是逼格满满
System.out.println(student);
}

打印结果如下:

Student[id=1, name=jack, passwd=1232, sex=男士, address=地球村]

最后做一下总结,什么是Bulider模式

不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静

态工厂),得到一个 builder 对象 。 然后客户端在 builder 对象上调用类似于 setter 的方法,来设置每个相关的可选参数。最后客户端调用无参的build方法来生成通常是不可变的对象

参考阅读:《Effective java(第3版)》第 2 条:遇到多个构造器参数时要考虑使用构建器

本人首发于个人公众号:河岸飞流 欢迎订阅

原文地址:https://mp.weixin.qq.com/s/Tr5rQGnDPti90hTwwHAKzQ

设计模式--Bulider模式的更多相关文章

  1. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  2. [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  3. [Head First设计模式]抢票中的设计模式——代理模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  4. [Head First设计模式]策略模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  5. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  6. [Head First设计模式]生活中学设计模式——迭代器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  7. [Head First设计模式]生活中学设计模式——组合模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  8. [Head First设计模式]生活中学设计模式——外观模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  9. [Head First设计模式]生活中学设计模式——状态模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

随机推荐

  1. 修改qt版本

    安装了qt4和qt5 /usr/lib/x86_64-linux-gnu/qt-default/qtchooser 的default.conf 第一行改成自己qmake的bin路径即可

  2. 列出python库的内置方法

    import cv dir(cv) ['16SC', '16UC', '32FC', '32SC', '64FC', '8SC', '8UC', 'Abs', 'AbsDiff', 'AbsDiffS ...

  3. Windows系统中CreateFileMapping实现的共享内存及用法

    在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模 ...

  4. C# 序列化与反序列化之DataContract与xml对子类进行序列化的解决方案

    C# 序列化与反序列化之DataContract与xml对子类进行序列化的解决方案 1.DataContract继承对子类进行序列化的解决方案 第一种是在 [DataContract, KnownTy ...

  5. Learning to Learn and Predict: A Meta-Learning Approach for Multi-Label Classification

    Learning to Learn and Predict: A Meta-Learning Approach for Multi-Label Classification 2019-10-01 11 ...

  6. 使用SpringEL功能来动态化模板数据

    在类似excel导出功能里,如果excel的格式很复杂,通过程序去动态生成格式显然是很吃力的,我们可以采用模板文件+动态表达式占位来生成目标文件. 如果只是纯粹生成纯文本,使用freemarker等模 ...

  7. response.redirect 正在中止线程

    问题描述:正在中止线程问题原因:Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件.不执行 Response.End ...

  8. (转)LoadRunner之录制你的第一个脚本

    LoadRunner安装完成之后,肯定就迫不及待的想要上手试用了.下面就是讲一下LR脚本录制的流程和基本的设置. 1.先放一张脚本录制以及运行的流程图 2.脚本录制步骤 1)以管理员身份打开LR软件, ...

  9. 关于Oracle to_date函数的高级用法

    由于种种原因,在我们的系统中,账套期间(PERIOD_NAME)由于格式设置的原因,数据库层存储的格式如下 Mar-19,而不是常规的2019-03. 我们无法更改数据库,涉及到的点太多. 但是期间数 ...

  10. Go:return 与 defer的执行顺序 (转)

    将下面的代码放入了 double.go 文件内 package main //go:noinline //go:nosplit func test() (x int) { defer println( ...