設計模式-生成器模式

張龍豪發表於2014-08-21

前言

點選檢視:設計模式系列 

生成器模式(建造者模式/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,資料結構。

 

相關文章