天天看點

3、Python與設計模式--建造者模式一、快餐點餐系統(2)二、建造者模式三、建造者模式的優點和使用場景四、建造者模式的缺點

今天的例子,還是上一次談到的快餐點餐系統。隻不過,今天我們從訂單的角度來構造這個系統。

最先還是有請上次的主角們:

主餐:

小食:

飲料:

最終,我們是要建造一個訂單,因而,需要一個訂單類。假設,一個訂單,包括一份主食,一份小食,一種飲料。(省去一些異常判斷)

代碼中的orderbuilder是什麼鬼?這個orderbuilder就是建造者模式中所謂的“建造者”了,先不要問為什麼不在order類中把所有内容都填上,而非要用builder去建立。接着往下看。

orderbuilder的實作如下:

在場景中如下去實作訂單的生成:

列印結果如下:

burger:spicy chicken burger

snack:chips

beverage:milk

建造者模式的定義如下:将一個複雜對象的建構與它的表示分離,使得同樣的建構過程可以建立不同的表示。

建造者模式的作用,就是将“建構”和“表示”分離,以達到解耦的作用。在上面訂單的建構過程中,如果将order直接通過參數定義好(其建構與表示沒有分離),同時在多處進行訂單生成,此時需要修改訂單内容,則需要一處處去修改,業務風險也就提高了不少。

在建造者模式中,還可以加一個director類,用以安排已有子產品的構造步驟。對于在建造者中有比較嚴格的順序要求時,該類會有比較大的用處。在上述例子中,director實作如下:

通過createorder直接代入參數,即可直接生成訂單。

3、Python與設計模式--建造者模式一、快餐點餐系統(2)二、建造者模式三、建造者模式的優點和使用場景四、建造者模式的缺點

優點:

1、封裝性好,使用者可以不知道對象的内部構造和細節,就可以直接建造對象;

2、系統擴充容易;

3、建造者模式易于使用,非常靈活。在構造性的場景中很容易實作“流水線”;

4、便于控制細節。

使用場景:

1、目标對象由元件構成的場景中,很适合建造者模式。例如,在一款賽車遊戲中,車輛生成時,需要根據級别、環境等,選擇輪胎、懸挂、骨架等部件,構造一輛“賽車”;

2、在具體的場景中,對象内部接口需要根據不同的參數而調用順序有所不同時,可以使用建造者模式。例如:一個植物養殖器系統,對于某些不同的植物,澆水、施加肥料的順序要求可能會不同,因而可以在director中維護一個類似于隊列的結構,在執行個體化時作為參數代入到具體建造者中。

1、“加工工藝”對使用者不透明。(封裝的兩面性)