设计模式–Bulider模式

起因:最近在做统计计算,创建的实体中属性比较多,都是一些数值,一开始是通过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 条:遇到多个构造器参数时要考虑使用构建器

Original: https://www.cnblogs.com/xieshuang/p/10876122.html
Author: 河岸飞流
Title: 设计模式–Bulider模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571668/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MYSQL5.7详细安装步骤

    0、更换yum源 1、打开 mirrors.aliyun.com,选择centos的系统,点击帮助 2、执行命令:yum install wget -y 3、改变某些文件的名称 m…

    Java 2023年6月7日
    097
  • Linux命令比较文件内容

    文件准备 创建两个文件,分别为a.txt和b.txt,它们所含内容分别为:a.txt b.txt 1-wfhune2-chdamnsbchj3-uyr92fiubkqw5-cgvd…

    Java 2023年6月16日
    059
  • springmvc静态资源配置

    <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>o…

    Java 2023年6月9日
    090
  • Skywalking-11:Skywalking查询协议——案例分析

    以查询 Metrics 信息案例来分析 Skywalking 查询协议 基本概述 Skywalking 查询协议默认基于 GraphQL ,如果有需要也可以自定义扩展,提供一个实现…

    Java 2023年6月5日
    079
  • Spring基于注解+扫描管理bean

    @Component:将类标识为普通组件 @Controller:将类标识为控制层组件 @Service:将类标识为业务层组件 @Repository:将类标识为持久层组件(dao…

    Java 2023年6月16日
    084
  • 多图流带你玩转CODING DevOps

    首先介绍一下什么是CODING DevOps,这里套用官网介绍 依托业界领先的敏捷项目管理理念与 DevOps 体系方法论,我们将这些优秀的理念与工具融入至产品中,打通了研发过程中…

    Java 2023年6月14日
    098
  • IO(字节流的读写操作)

    IO流的分类:* 流向:* 输入流 读取数据* 输出流 写出数据* 数据类型:* 字节流* 字节输入流 读取数据 InputStream* 字节输出流 写出数据 OutputStr…

    Java 2023年6月5日
    0124
  • idea中无法使用EL表达式怎么处理

    posted @2022-08-05 13:39 红酒人生 阅读(33 ) 评论() 编辑 Original: https://www.cnblogs.com/holly8/p/1…

    Java 2023年6月13日
    073
  • Spring Cloud认知学习(六):配置中心Spring Cloud Config的使用

    Spring Cloud Config 作用: 简单示例 创建配置中心 拉取配置 测试 补充: 💡上一篇介绍一个新的组件Zuul,Zuul是网关组件,对Api请求进行了统一的接收,…

    Java 2023年5月30日
    093
  • spring事务传播行为详解

    简单的理解就是多个事务方法相互调用时,事务如何在这些方法间传播。 举个栗子,方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对…

    Java 2023年5月30日
    072
  • nginx代理后端服务返回404

    nginx代理后端服务返回404 需带上host头 location ^~ /publicApi/ { rewrite ^/publicApi/(.*)$ /public/v1/$…

    Java 2023年5月30日
    082
  • Dijkstra算法(三)之 Java详解

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 基本…

    Java 2023年5月29日
    078
  • poi读excel的空cell时,产生空指针

    背景 昨天,我用poi读取excel时,当读到空的cell时,抛出个空指针异常。但是当我读取别的excel时,即使cell为空,也不抛空指针啊,读出结果为”&#8221…

    Java 2023年6月5日
    067
  • JAVA入门基础_从零开始的培训_Linux基础入门理解

    Linux操作系统 Linux操作系统的应用领域 VMware虚拟机的安装 在BIOS中开启操作系统的虚拟化 虚拟机的实际安装 Centos7.6版本的安装 下载Centos操作系…

    Java 2023年6月9日
    075
  • 小程序字节转GBK及UTF8

    前段时间在Android原生搞的BLE扫码枪又要移植到小程序上来。本以为小程序不支持BLE的,结果一搜,还真支持-_-|| 。 蓝牙部分问题不大,遇到的主要问题是, 小程序环境如何…

    Java 2023年6月15日
    084
  • 九、运算符

    一、基本运算符 1.1、Java语言支持的运算符 1.&#x7B97;&#x672F;&#x8FD0;&#x7B97;&#x7B26;&am…

    Java 2023年6月5日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球