java的Builder原理和實現(xiàn)詳解
首先給一個簡單的Builder設(shè)計模式的例子:
主實現(xiàn)類代碼如下:
/**
* 實體類 包含一個靜態(tài)內(nèi)部類 Builder
*/
public class CompanyClient {
public String companyName;
// 用final修飾的成員變量表示常量,只能被賦值一次,賦值后值無法改變! final修飾的變量有三種:靜態(tài)變量、實例變量和局部變量。
public String companyAddress;
public double companyRegfunds;
public String mPerson;
public String mType;
//構(gòu)造方法
public CompanyClient() {
this(new Builder());
}
//構(gòu)造方法
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這個對象的時候,會默認的調(diào)用toString()這個方法。
public String toString() {
return "CompanyClient{" +
"companyName='" + companyName + '\'' +
", companyAddress='" + companyAddress + '\'' +
", companyRegfunds=" + companyRegfunds +"千萬"+
", mPerson=" + mPerson +
", mType='" + mType + '\'' +
'}';
}
/**
*靜態(tài)內(nèi)部類 Builder
*/
public static class Builder{
public String companyName;
public String companyAddress;
public double companyRegfunds;
public String person;
public String type;
//構(gòu)造方法
public Builder() {
companyName = companyName;
companyAddress = companyAddress;
companyRegfunds = companyRegfunds;
person = person;
type = type;
}
//構(gòu)造方法
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;
}
//構(gòu)建一個實體
public CompanyClient build() {
return new CompanyClient(this);
}
}
}
測試類實現(xiàn)代碼如下:
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);
}
}
輸出結(jié)果如下:
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函數(shù)中的第一行代碼:
CompanyClient client = new CompanyClient.Builder()
.setCompanyName("alibaba")
.setCompanyAddress("wangjing")
.setCompanyRegfunds(5)
.setmPerson("10000")
.build();
之所以可以這么執(zhí)行,是因為內(nèi)部靜態(tài)類Builder里定義了一份與CompanyClient類一模一樣的變量,通過一系列的成員函數(shù)進行設(shè)置屬性值,但是返回值都是this,也就是都是Builder對象,最后提供了一個build函數(shù)用于創(chuàng)建CompanyClient對象,返回的是CompanyClient對象,對應(yīng)的構(gòu)造函數(shù)在CompanyClient?類中進行定義,也就是構(gòu)造函數(shù)的入?yún)⑹?strong>Builder對象,然后依次對自己的成員變量進行賦值,對應(yīng)的值都是Builder對象中的值。此外Builder類中的成員函數(shù)返回Builder對象自身的另一個作用就是讓它支持鏈式調(diào)用,使代碼可讀性大大增強。
總結(jié)下,Java環(huán)境下builder設(shè)計模式:
定義一個靜態(tài)內(nèi)部類Builder,內(nèi)部的成員變量和外部類一樣
Builder類通過一系列的方法用于成員變量的賦值,并返回當前對象本身(this)
Builder類提供一個build方法或者create方法用于創(chuàng)建對應(yīng)的外部類,該方法內(nèi)部調(diào)用了外部類的一個私有構(gòu)造函數(shù),該構(gòu)造函數(shù)的參數(shù)就是內(nèi)部類Builder
外部類提供一個私有構(gòu)造函數(shù)供內(nèi)部類調(diào)用,在該構(gòu)造函數(shù)中完成成員變量的賦值,取值為Builder對象中對應(yīng)的值
到此這篇關(guān)于java的Builder原理和實現(xiàn)詳解的文章就介紹到這了,更多相關(guān)java Builder原理和實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springcloud實現(xiàn)服務(wù)多版本控制的示例代碼
這篇文章主要介紹了Springcloud實現(xiàn)服務(wù)多版本控制的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Spring Boot 集成 ElasticSearch應(yīng)用小結(jié)
這篇文章主要介紹了Spring Boot 集成 ElasticSearch應(yīng)用小結(jié),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11
Java中多個線程交替循環(huán)執(zhí)行的實現(xiàn)
有些時候面試官經(jīng)常會問,兩個線程怎么交替執(zhí)行呀,本文就來詳細的介紹一下Java中多個線程交替循環(huán)執(zhí)行的實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01

