設計模式 4/23 建造者模式

暫停了一週,因爲種種緣由吧,外在的,內在的,各類致使了學習暫定了一週,連續學習真的是一件很難的事情。程序員

最近在換工做,從一家偉大的公司換到另一家偉大的公司,緣由只是不想再呆在外包,請原諒個人膚淺設計模式

不過,學習使我快樂ide

設計模式,不要迷信,也不要輕信,但不可不知道,如今衆所周知的23種設計模式只是對前人們的進行一個總結,不是說只有這23種,切記學習

今天介紹 建造者模式ui

建造者,Builder,擁有上帝視角,毫不出錯spa

建造者模式:將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示設計

敲黑板了,注意看,3個點3d

1.處理的是一個複雜對象,簡單對象就沒有必要用此模式了,每次模式的運用,都是類結構的複雜化過程,注意權衡得失利弊code

2.構建與表示分離,分離是爲了更好的相遇對象

3.一樣的過程,不一樣的表示,就是經歷相同的過程,能產生不同的對象,就好像128G和256G的蘋果手機,裝配過程徹底相同,但倒是不一樣的型號的手機(此未考證,純屬爲了舉例而舉例)

複雜,分離,相同

三個詞,咱們舉個例子,細細品味下

法式大餐,堪稱西餐之首,程序複雜,過程繁多

法國大餐至少有五道,你帶着你女友準備去浪漫一回【程序員怎麼會有女友,這是個bug】,第一次到了法式餐廳,你得點餐吧,你不會直接去後廚告訴大廚,你要羊扒陪香檳加咖啡吧,你也不知道法式大餐有5道菜啊,並且你發現,服務員特別推薦他們今天的2種套餐,咱們姑且稱爲Alpha法式大餐和Beta法式大餐。因而你就想,要不來個A餐吧,因而服務員知道你要A餐,點餐完畢,就等上菜了

基於以上,咱們來看看代碼怎麼實現,代碼即生活啊

首先咱們有一個法式大餐的類,這個類規定,咱們法式大餐至少5道

     /// <summary>
    /// 法式大餐
    /// </summary>
    public abstract class FrenchDinner
    {
        /// <summary>
        /// 開胃酒
        /// </summary>
        public abstract void Aperitif();

        /// <summary>
        /// 前菜
        /// </summary>
        public abstract void Appetizer();

        /// <summary>
        /// 主菜
        /// </summary>
        public abstract void MainCourse();

        /// <summary>
        /// (餐後)甜點
        /// </summary>
        public abstract void Dessert();

        /// <summary>
        /// 咖啡
        /// </summary>
        public abstract void Coffee();
    }
View Code

那今天餐廳特別推薦 Alpha法式大餐 和 Beta法式大餐

    /// <summary>
    /// Alpha法式大餐
    /// </summary>
    public class AlphaFrenchDinner : FrenchDinner
    {
        public AlphaFrenchDinner()
        {
            Console.WriteLine("這是 Alpha 法式大餐");
        }

        /// <summary>
        /// 開胃酒
        /// </summary>
        public override void Aperitif()
        {
            Console.WriteLine("開胃酒:紅葡萄酒");
        }

        /// <summary>
        /// 前菜
        /// </summary>
        public override void Appetizer()
        {
            Console.WriteLine("前菜:沙拉");
        }

        /// <summary>
        /// 主菜
        /// </summary>
        public override void MainCourse()
        {
            Console.WriteLine("主菜:牛排");
        }

        /// <summary>
        /// (餐後)甜點
        /// </summary>
        public override void Dessert()
        {
            Console.WriteLine("甜點:蛋奶酥");
        }

        /// <summary>
        /// 咖啡
        /// </summary>
        public override void Coffee()
        {
            Console.WriteLine("咖啡:卡布奇諾");
        }
    }


    /// <summary>
    /// Beta法式大餐
    /// </summary>
    public class BetaFrenchDinner : FrenchDinner
    {
        public BetaFrenchDinner()
        {
            Console.WriteLine("這是Beta 法式大餐");
        }

        /// <summary>
        /// 開胃酒
        /// </summary>
        public override void Aperitif()
        {
            Console.WriteLine("開胃酒:香檳");
        }

        /// <summary>
        /// 前菜
        /// </summary>
        public override void Appetizer()
        {
            Console.WriteLine("前菜:海鮮");
        }

        /// <summary>
        /// 主菜
        /// </summary>
        public override void MainCourse()
        {
            Console.WriteLine("主菜:羊扒");
        }

        /// <summary>
        /// (餐後)甜點
        /// </summary>
        public override void Dessert()
        {
            Console.WriteLine("甜點:慕斯");
        }

        /// <summary>
        /// 咖啡
        /// </summary>
        public override void Coffee()
        {
            Console.WriteLine("咖啡:紅茶");
        }
    }
View Code

那你不能本身去告訴後廚說你要A餐吧,這個時候有個服務員,這個就是咱們建造者模式中最重要的角色

    /// <summary>
    /// 
    /// </summary>
    public class FrenchDirector
    {
        public FrenchDirector(FrenchDinner frenchDinner)
        {
            _frenchDinner = frenchDinner;
        }

        private FrenchDinner _frenchDinner;

        /// <summary>
        /// build法式大餐
        /// </summary>
        public void CreateFrenchDinner()
        {
            _frenchDinner.Aperitif();
            _frenchDinner.Appetizer();
            _frenchDinner.MainCourse();
            _frenchDinner.Dessert();
            _frenchDinner.Coffee();
        }
    }
View Code

那輪到你上場了,也就是咱們怎麼調用了

  static void Main()
        {
            var director = new FrenchDirector(new BetaFrenchDinner());//請幫我點個B餐
            director.CreateFrenchDinner();
            Console.ReadLine();
        }
View Code

最後的輸出是

「這是Beta 法式大餐」
「開胃酒:香檳」
「前菜:海鮮」
「主菜:羊扒」
「甜點:慕斯」
「咖啡:紅茶」

總結下

優勢

1.顯而易見,複雜的對象被輕鬆建立,而且不會少一步也不會多一步

2.若是還有C餐,D餐,咱們只須要繼續增長相關類便可

3.若是法式大餐要在家吃,須要跳過開胃酒,直接進入主菜和甜品,那咱們只須要再多建立一個建造者類FrenchDirector便可

缺點

一、對象必須有共同點,範圍受到限制,好比我想增長一道程序,則咱們須要修改的每個繼承者

二、如內部變化複雜,會有不少的建造者類,增長了系統的複雜程度

以上就是關於 建造者模式 的分享,來的晚些,但不會缺席

相關文章
相關標籤/搜索