建造者模式,或者說是構建者模式,是一種建立型模式。建造者模式將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
(建造者模式就是如何一步步構建包含多個元件的物件,相同的建立過程可以建立不同的產品,適用於流程固定但順序不一定固定的物件,比如做一盤菜,有人喜歡先放鹽,有人喜歡後放鹽,都沒關係,但放鹽這個過程是一定要有的)
一般建立物件我們最常用的方式是直接使用new呼叫物件的建構函式。但是如果建立的是乙個引數較多的複雜物件呢?如果通過建構函式直接new的話,**的可讀性和易用性都會變差,而且容易搞錯各個引數的順序,傳遞進錯誤的引數值,造成一些不容易發現的bug。如果不用建構函式傳遞所有的引數,而是通過建構函式傳遞必填的引數,通過set設定選填的引數,又會有新的問題,那就是如果必填項很多呢?如果非必填項需要校驗呢?如果希望物件建立出來之後不可變呢?這時候,建造者模式就派上用場了。建造者模式的使用場景也就清晰了。
那建造者模式和工廠模式有什麼區別呢?
工廠模式是用來建立一組型別相關的物件(繼承同一父類或介面的一組子類),通過給定的引數決定建立哪種型別的物件。而建造者模式是用來建立一種型別的複雜物件,通過引數的不同,定製化地建立不同的物件。
比如要實現乙個執行緒池配置類。有name(資源名稱)、maxtotal (最大執行緒數)、minidle(最小空閒執行緒數)、maxidle(最大空閒執行緒數)。name必填,maxtotal非必填預設8,maxidle非必填預設8,minidle非必填預設0。
通過建造者模式,可以將各個引數的校驗邏輯放在builder類的build()方法中,在物件建立前做集中校驗。且將建構函式設為private,實現物件不可變,只能通過構建者類建立物件。
public
class
resourcepoolconfig
//省略getter方法
//內部builder類
public
static
class
builder
if(maxidle > maxtotal)
if(minidle > maxtotal || minidle > maxidle)
return
newresourcepoolconfig
(this);
}public builder setname
(string name)
this
.name = name;
return
this;}
public builder setmaxtotal
(int maxtotal)
this
.maxtotal = maxtotal;
return
this;}
public builder setmaxidle
(int maxidle)
this
.maxidle = maxidle;
return
this;}
public builder setminidle
(int minidle)
this
.minidle = minidle;
return
this;}
}}//客戶端
resourcepoolconfig config =
newresourcepoolconfig.builder()
.setname
("testpool").
setmaxtotal(16
).setmaxidle(10
).setminidle(12
).build
()
可以發現,建造者模式的builder類必須包含被建立物件的所有屬性。如果物件的屬性發生變化,那建造者類就需要做相應的修改。
以下是經典構建者模式類圖:
設計模式之建造者模式
軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟 設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設 計模式 和...
設計模式之建造者模式
建造者模式也叫生成器模式,是一種物件建立型模式,用來隱藏復合物件的建立過程,它把復合物件的建立過程加以抽象,通過子類繼承或過載的方式,動態的建立具有復合屬性的物件。應用場景 物件的建立 builder 模式是為物件的建立而設計的模式 建立的是乙個復合物件 被建立的物件為乙個具有復合屬性的復合物件 關...
設計模式之建造者模式
在做服務介面的時候,往往在業務處理之前需要做業務校驗,格式校驗等業務前處理。這些介面有個相同的特徵,就是必須經過這些處理步驟之後才能做核心的業務處理,拓展的服務介面也必須經過這些處理。基於這個特徵,我們就來分析一下設計模式中,建造者模式。我們先建乙個基礎的服務類 public abstract cl...