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