今天的例子,還是上一次談到的快餐點餐系統。隻不過,今天我們從訂單的角度來構造這個系統。
最先還是有請上次的主角們:
主餐:
小食:
飲料:
最終,我們是要建造一個訂單,因而,需要一個訂單類。假設,一個訂單,包括一份主食,一份小食,一種飲料。(省去一些異常判斷)
代碼中的orderbuilder是什麼鬼?這個orderbuilder就是建造者模式中所謂的“建造者”了,先不要問為什麼不在order類中把所有内容都填上,而非要用builder去建立。接着往下看。
orderbuilder的實作如下:
在場景中如下去實作訂單的生成:
列印結果如下:
burger:spicy chicken burger
snack:chips
beverage:milk
建造者模式的定義如下:将一個複雜對象的建構與它的表示分離,使得同樣的建構過程可以建立不同的表示。
建造者模式的作用,就是将“建構”和“表示”分離,以達到解耦的作用。在上面訂單的建構過程中,如果将order直接通過參數定義好(其建構與表示沒有分離),同時在多處進行訂單生成,此時需要修改訂單内容,則需要一處處去修改,業務風險也就提高了不少。
在建造者模式中,還可以加一個director類,用以安排已有子產品的構造步驟。對于在建造者中有比較嚴格的順序要求時,該類會有比較大的用處。在上述例子中,director實作如下:
通過createorder直接代入參數,即可直接生成訂單。
優點:
1、封裝性好,使用者可以不知道對象的内部構造和細節,就可以直接建造對象;
2、系統擴充容易;
3、建造者模式易于使用,非常靈活。在構造性的場景中很容易實作“流水線”;
4、便于控制細節。
使用場景:
1、目标對象由元件構成的場景中,很适合建造者模式。例如,在一款賽車遊戲中,車輛生成時,需要根據級别、環境等,選擇輪胎、懸挂、骨架等部件,構造一輛“賽車”;
2、在具體的場景中,對象内部接口需要根據不同的參數而調用順序有所不同時,可以使用建造者模式。例如:一個植物養殖器系統,對于某些不同的植物,澆水、施加肥料的順序要求可能會不同,因而可以在director中維護一個類似于隊列的結構,在執行個體化時作為參數代入到具體建造者中。
1、“加工工藝”對使用者不透明。(封裝的兩面性)