java的Builder原理和实现详解

网友投稿 895 2022-09-06


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 = bXhuGkPuLGuilder.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', coXhuGkPuLGmpanyRegfunds=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对象中对应的值

http://


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:唯一分解定理常用方法(因数唯一分解定理)
下一篇:Python入门基础知识(python零基础入门学的内容都有哪些?)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~