java的Builder原理和实现详解

 更新时间:2021年12月29日 10:32:08   作者:I_belong_to_jesus  
大家好,本篇文章主要讲的是java的Builder原理和实现详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

首先给一个简单的Builder设计模式的例子:

主实现类代码如下:

/**
 * 实体类 包含一个静态内部类 Builder
 */
public class CompanyClient {
    public String companyName;
    // 用final修饰的成员变量表示常量,只能被赋值一次,赋值后值无法改变! final修饰的变量有三种:静态变量、实例变量和局部变量。
    public String companyAddress;
  
    public double companyRegfunds;
    public String mPerson;
    public String mType;     
     //构造方法 
     public CompanyClient() {
         this(new Builder());
     }
     //构造方法
     public CompanyClient(Builder builder){
         this.companyName = builder.companyName;
         this.companyAddress = builder.companyAddress;
         this.companyRegfunds = builder.companyRegfunds;
         this.mPerson = builder.person;
         this.mType = builder.type;
     }
     public String getCompanyName() {
         return companyName;
     }
  
     public String getCompanyAddress() {
         return companyAddress;
     }
  
     public double getCompanyRegfunds() {
         return companyRegfunds;
     }
  
     public String getmPerson() {
         return mPerson;
     }
  
     public String getmType() {
         return mType;
     }
         
     public Builder newBuilder() {
         return new Builder(this);
     }
  
     @Override //重写toString方法后,当print这个对象的时候,会默认的调用toString()这个方法。
     public String toString() {
         return "CompanyClient{" +
                 "companyName='" + companyName + '\'' +
                 ", companyAddress='" + companyAddress + '\'' +
                 ", companyRegfunds=" + companyRegfunds +"千万"+
                 ", mPerson=" + mPerson +
                 ", mType='" + mType + '\'' +
                 '}';
     }
     /**
     *静态内部类 Builder
     */
     public static class Builder{
        public String companyName;
        public String companyAddress;
        public  double companyRegfunds;
        public  String person;
        public String type;
        //构造方法
        public Builder() {
            companyName = companyName;
            companyAddress = companyAddress;
            companyRegfunds = companyRegfunds;
            person = person;
            type = type;
  
        }
        //构造方法
        Builder(CompanyClient companyClient){
            this.companyName = companyClient.companyName;
            this.companyAddress = companyClient.companyAddress;
            this.companyRegfunds = companyClient.companyRegfunds;
            this.person = companyClient.mPerson;
            this.type = companyClient.mType;
        }
  
        public Builder setCompanyName(String name) {
            companyName = name;
            return this;
        }
  
        public Builder setCompanyAddress(String address) {
            companyAddress = address;
            return this;
        }
  
        public Builder setCompanyRegfunds(double regfunds) {
            companyRegfunds = regfunds;
            return this;
        }
  
        public Builder setmPerson(String per) {
            person = per;
            return this;
        }
  
        public Builder setmType(String typeStr) {
            type = typeStr;
            return this;
        }
         //构建一个实体
         public CompanyClient build() {
             return new CompanyClient(this);
         }
    }
 }

测试类实现代码如下:

public class TestBuilder {
    public static void main(String[] args) {
 
        CompanyClient client = new CompanyClient.Builder()
                .setCompanyName("alibaba")
                .setCompanyAddress("wangjing")
                .setCompanyRegfunds(5)
                .setmPerson("10000")
                .build();
        System.out.println(client);
        System.out.println("---------------------");
        CompanyClient.Builder builder = new CompanyClient.Builder();
        builder.setCompanyName("huawei");
        builder.setCompanyAddress("haidian");
        builder.setCompanyRegfunds(20);
        builder.setmType("communication");
        CompanyClient client1 = builder.build();
        System.out.println(client1);
        System.out.println("---------------------");
        CompanyClient.Builder build1 = client1.newBuilder();
        build1.setCompanyName("baidu");
        CompanyClient client2 = build1.build();
        System.out.println(client2);
    }
}

输出结果如下:

CompanyClient{companyName='alibaba', companyAddress='wangjing', companyRegfunds=5.0千万, mPerson=10000, mType='null'}
---------------------
CompanyClient{companyName='huawei', companyAddress='haidian', companyRegfunds=20.0千万, mPerson=null, mType='communication'}
---------------------
CompanyClient{companyName='baidu', companyAddress='haidian', companyRegfunds=20.0千万, mPerson=null, mType='communication'}

首先看main函数中的第一行代码:

CompanyClient client = new CompanyClient.Builder()
                .setCompanyName("alibaba")
                .setCompanyAddress("wangjing")
                .setCompanyRegfunds(5)
                .setmPerson("10000")
                .build();

之所以可以这么执行,是因为内部静态类Builder里定义了一份与CompanyClient类一模一样的变量,通过一系列的成员函数进行设置属性值,但是返回值都是this,也就是都是Builder对象,最后提供了一个build函数用于创建CompanyClient对象,返回的是CompanyClient对象,对应的构造函数在CompanyClient 类中进行定义,也就是构造函数的入参是Builder对象,然后依次对自己的成员变量进行赋值,对应的值都是Builder对象中的值。此外Builder类中的成员函数返回Builder对象自身的另一个作用就是让它支持链式调用,使代码可读性大大增强。

总结下,Java环境下builder设计模式:

定义一个静态内部类Builder,内部的成员变量和外部类一样

Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)

Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder

外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值

到此这篇关于java的Builder原理和实现详解的文章就介绍到这了,更多相关java Builder原理和实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何正确的使用wait-notify方法你知道吗

    Java如何正确的使用wait-notify方法你知道吗

    这篇文章主要为大家详细介绍了Java如何正确的使用wait-notify方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • SpringBoot解决跨域的5种方式小结

    SpringBoot解决跨域的5种方式小结

    在项目开发中,时常会遇到跨域问题,本文主要介绍了五种解决跨域的方法,使用最多的是第三种,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • @RequestBody注解Ajax post json List集合数据请求400/415的处理

    @RequestBody注解Ajax post json List集合数据请求400/41

    这篇文章主要介绍了@RequestBody注解Ajax post json List集合数据请求400/415的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • java中生产者消费者问题和代码案例

    java中生产者消费者问题和代码案例

    大家好,本篇文章主要讲的是java中生产者消费者问题和代码案例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • springboot自动配置原理解析

    springboot自动配置原理解析

    这篇文章主要介绍了springboot自动配置原理解析,帮助大家更好的理解和学习使用springboot,感兴趣的朋友可以了解下
    2021-04-04
  • Java多线程4种拒绝策略小结

    Java多线程4种拒绝策略小结

    当线程池中的任务队列已满且无法再接受新的任务时,就需要采取拒绝策略来处理这种情况,本文主要介绍了Java多线程拒绝策略,包含了四种常见的拒绝策略,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • springboot常用语法库的基本语法

    springboot常用语法库的基本语法

    FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具,这篇文章主要介绍了springboot常用语法库的基本语法,需要的朋友可以参考下
    2022-12-12
  • Spring Boot Logging Level设置为off时的Bug

    Spring Boot Logging Level设置为off时的Bug

    这篇文章主要介绍了Spring Boot Logging Level设置为off时的Bug,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Mybatis Plus 逆向工程介绍

    Mybatis Plus 逆向工程介绍

    这篇文章主要介绍了Mybatis Plus 逆向工程,文章通过Mybatis Plus 逆向工程相关资料及示例代码详细介绍,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考一下
    2022-01-01
  • IE8+SpringMVC文件上传防止JSON下载

    IE8+SpringMVC文件上传防止JSON下载

    这篇文章主要介绍了IE8+SpringMVC文件上传防止JSON下载的相关资料,需要的朋友可以参考下
    2017-07-07

最新评论