起因:最近在做统计计算,创建的实体中属性比较多,都是一些数值,一开始是通过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. RNN 权重共享

    之前在几篇博客中说到了权重共享,但都觉得不够全面,这里做个专题,以后有新的理解都在此更新. 1. 减少运算只是锦上添花之前说到权重共享可以减少运算,是的,但这样说好像是可有可无,只是运算量大小的问题, ...

  2. JVM探究之 —— 垃圾回收(二)

    1. 垃圾收集算法 1.1 标记清除(Mark-Sweep)算法 标记—清除算法是第一种使用和比较完善的垃圾回收算法,后续的收集算法都是基于其设计思路并对其不足进行改进而得到的. 该算法分为“标记”和 ...

  3. 使用 Microsoft.Web.Administration 管理iis

    How to Automate IIS 7 Configuration with .NET How to Automate IIS 7 Configuration with .NET Are you ...

  4. linux剪贴板

    ubuntu下的用户可以只用apt-get来安装: `sudo apt-get install xclip ` 其他发行版的用户可以选择自己的安装方式,也可以用源码编译安装,xclip项目的主页是:h ...

  5. mybatis查询mysql的datetime类型数据时间差了14小时

    场景: 数据库字段: mybatis使用 now() 生成时间. 结果: 使用mybatis查询mysql中的数据时,所有时间都比数据库时间多了14小时,考虑了一下,初步判定是系统时区的问题.因为my ...

  6. Roberts算子

    https://blog.csdn.net/likezhaobin/article/details/6892176 https://zhuanlan.zhihu.com/p/35032299 Robe ...

  7. Android设置顶部banner背景透明度时影响全局背景问题

    项目中用到滑动界面使顶部title栏背景渐隐渐现的效果,即初始不滑动时的透明度为0,用了bannerle.getBackground().setAlpha(0); 但使用这个方法设置透明度是管用,返回 ...

  8. Ubuntu系统配置双网卡ssh放外网

    (下面的IP,最后一位都用X代替) 先看看网卡设备的名字,下面要用(一般就是前两个):ifconfigsudo lshw -C network| grep -e  'logical name' 设置服 ...

  9. 解决ImportError: No module named utils

    转载:https://blog.csdn.net/weixin_43979572/article/details/86159265 在Python中遇到了导包错误,其实包已经有了.原因是我再B文件的a ...

  10. rocketmqy压测消费端解决源码中不能正常消费的问题

    因为近期在做rocketmq的性能压测,然后看到一些文章,提到用rocketmq中的自带的benchamark工具进行压测,因为我们公司是自己在做了一个二次封装,做了一层认证,所以工具还需要在改造,所 ...