前言
點選檢視:設計模式系列
生成器模式(建造者模式/builder)
定義:將一個複雜的物件,分成多分,使同樣的構建過程,能有不同的表示,這樣的設計模式被稱為建造者模式。
舉例說明:
李嘉誠的遺囑執行:
財產(產品角色):李嘉誠擁有眾多複雜的財產框架,這裡以現金與物品入例。
遺囑(建造者):相當於建造者,分配現金與物品。
具體遺囑(具體建造者):1.給大兒子的財產分配,2,給小兒子的財產分配。
律師(指導者角色):按照具體的遺囑指令分配財產。
例子類圖:
龐大的財產結構程式碼:
// 財產(複雜的財產) class CaiChan { //現金 public float money { get; set; } // 物品 public string product { get; set; } //展示老爸留給他的遺產 public void Show() { Console.WriteLine(" 我昇仙以後,給你現金:"+money+"元,給你的物品是:"+product); } }
遺囑關於遺產的分配,建造者,具體建造者
// 爸爸分配財產(建造者) abstract class DidCaiChan { //分錢 abstract public void giveMoney(); //分傳家寶 abstract public void giveProduct(); abstract public CaiChan getCaiChan(); } // 大哥繼承爸爸的財產(具體建造者) class OlderBrotherCaiChan : DidCaiChan { // 財產 private CaiChan cc; //留給的現金 override public void giveMoney() { cc = new CaiChan(); cc.money = (float)0.5; } //留給的傳家寶 override public void giveProduct() { cc.product = "小板凳一個"; } override public CaiChan getCaiChan() { return cc; } } // 弟弟繼承爸爸的財產(具體建造者) class LittleBrotherCaiChan : DidCaiChan { // 財產 private CaiChan cc; //留給的現金 override public void giveMoney() { cc = new CaiChan(); cc.money = (float)0.25; } //留給的傳家寶 override public void giveProduct() { cc.product = "小桌子一張"; } override public CaiChan getCaiChan() { return cc; } }
律師入場,依據遺囑分配財產(指導者角色)
//律師(指導者角色) class LvShi { // 安按照遺書分配 public void Give(DidCaiChan builder) { builder.giveMoney(); builder.giveProduct(); } }
分配遺產現場,客戶端
//律師入場 LvShi ls = new LvShi(); //宣讀,關於哥哥和弟弟的遺產分配譯文 DidCaiChan ge = new OlderBrotherCaiChan(); DidCaiChan di = new LittleBrotherCaiChan(); //分配財產開始 Console.WriteLine("律師宣讀父親給哥哥的遺言,並分配財產:"); ls.Give(ge); ge.getCaiChan().Show(); //點任意鍵,給弟弟分配財產 Console.ReadKey(); Console.WriteLine("律師宣讀父親給弟弟的遺言,並分配財產:"); ls.Give(di); di.getCaiChan().Show(); Console.ReadKey();
遺產分配完美結束,關於生成器模式(建造者模式)總結
以下情況應當使用建造者模式:
1、 產品物件的內部結構需要有不同的展示。
2、 不同的展示物件屬性依賴與同一個產品物件,產品物件內部順序可自行調整使用。
3、 在物件建立過程中會使用到系統中的一些其它物件,這些物件在產品物件的建立過程中不易得到。
使用建造者模式主要有以下效果:
1、 建造模式的使用使得產品的內部表象可以獨立的變化。使用建造者模式可以使客戶端不必知道產品內部組成的細節。
2、 每個特定的建造者都獨立於其它建造者和程式的其餘部分,這提高拉模組化程度,並使得新增其建造者變的靈活簡單。
3、 因為每一個建造者都是根據資料來逐步構造出最終的產品的,因此對建造者構造的每個最終產品從頭到尾有更好的控制能力。
歡迎加入部落格左上方群,交流探討,設計模式,資料庫,c#.net,資料結構。