設(shè)計(jì)模式之建造者模式Builder
建造者模式:
創(chuàng)建者模式隱藏了復(fù)雜對象的創(chuàng)建過程,它把復(fù)雜對象的創(chuàng)建過程加以抽象,通過子類繼承或者重載的方式,動態(tài)的創(chuàng)建具有復(fù)合屬性的對象。通俗的講就是 創(chuàng)建可裝配的復(fù)雜對象
建造者模式,屬于創(chuàng)建類型
實(shí)際代碼我放在了Github: https://github.com/liangtengyu/DesignPatterns-for-Java
應(yīng)用場景:
學(xué)習(xí)一個(gè)設(shè)計(jì)模式之前 我們先了解它的使用場景能夠幫我們更快的理解它,實(shí)現(xiàn)方式:
當(dāng)使用new()時(shí) 參數(shù)過多容易導(dǎo)致混亂和BUG的產(chǎn)生
使用set方法賦值時(shí) 會創(chuàng)建一個(gè)可變對象,即對象創(chuàng)建完后還可以使用set方法改變變量,此時(shí)應(yīng)該使用builer 使用new關(guān)鍵字創(chuàng)建對象時(shí),對于入?yún)⒌男r?yàn)比較混亂 使用set方法時(shí),對于入?yún)⒌男r?yàn)比較分散,不容易集中管理 當(dāng)一個(gè)類的構(gòu)造函數(shù)參數(shù)個(gè)數(shù)超過4個(gè),而且這些參數(shù)有些是可選的參數(shù),考慮使用構(gòu)造者模式。 使用Builder的好處
將入?yún)⒌男r?yàn)邏輯都封裝到build()方法中,進(jìn)行統(tǒng)一的處理,處理完成才創(chuàng)建對象,否則不創(chuàng)建對象,方便管理校驗(yàn)邏輯 使用build方法創(chuàng)建對象后,對象無法通過set方法進(jìn)行修改參數(shù),保證了對象的不可變
實(shí)現(xiàn)方式:
例:
public class ResourceConfig {
private String name;
private int maxTotal;
private int maxIdle;
private int minIdle;
private ResourceConfig(ResourceConfigBuilder builder) {
this.name = builder.name;//使用static 內(nèi)部類可以直接拿屬性
this.maxTotal = builder.getMaxTotal();//也可以通過get方法獲取
this.maxIdle = builder.getMaxIdle();
this.minIdle = builder.getMinIdle();
}
public String getName() {
return name;
}
public int getMaxTotal() {
return maxTotal;
}
public int getMaxIdle() {
return maxIdle;
}
public int getMinIdle() {
return minIdle;
}
@Override
public String toString() {
return "ResourceConfig{" +
"name='" + name + '\'' +
", maxTotal=" + maxTotal +
", maxIdle=" + maxIdle +
", minIdle=" + minIdle +
'}';
}
public static class ResourceConfigBuilder {
private static final int DEF_MAX_TOTAL = 8 ;
private static final int DEF_MAX_IDLE=0;
private static final int DEF_MIN_IDLE=0;
private String name;
private int maxTotal=DEF_MAX_TOTAL;
private int maxIdle = DEF_MAX_IDLE;
private int minIdle = DEF_MIN_IDLE;
public ResourceConfigBuilder setName(String name) {
this.name = name;
return this;//返回this 能夠?qū)崿F(xiàn)鏈?zhǔn)秸{(diào)用
}
public ResourceConfigBuilder setMaxTotal(int maxTotal) {
this.maxTotal = maxTotal;
return this;
}
public ResourceConfigBuilder setMaxIdle(int maxIdle) {
this.maxIdle = maxIdle;
return this;
}
public ResourceConfigBuilder setMinIdle(int minIdle) {
this.minIdle = minIdle;
return this;
}
public String getName() {
return name;
}
public int getMaxTotal() {
return maxTotal;
}
public int getMaxIdle() {
return maxIdle;
}
public int getMinIdle() {
return minIdle;
}
public ResourceConfig build(){
//校驗(yàn)邏輯放到build()方法之前,先校驗(yàn) 再 創(chuàng)建
if (minIdle > maxTotal) {
throw new IllegalArgumentException("無效的參數(shù), cause : minIdle > maxTotal");
}
return new ResourceConfig(this);
}
}
}
總結(jié)-抽象理解
創(chuàng)建對象我們可以通過工廠方法和builder
工廠方法相當(dāng)于對同類工廠抽象,如:披薩 漢堡 同是KFC的產(chǎn)品. 定向生產(chǎn)這2種產(chǎn)品工廠,披薩工廠 漢堡工廠
Builder相當(dāng)于對于一種類的創(chuàng)建過程繁瑣的抽象,如 披薩 我們在創(chuàng)建過程中想用什么肉類,什么蔬菜,甜還是咸,創(chuàng)建之前統(tǒng)一進(jìn)行處理,到最終創(chuàng)建完成
評論
圖片
表情
