設計模式系列-建造者模式

 

         快樂技術沙龍即將一週歲了,最近它又多了個妹妹叫《嗨皮吧》,春哥(秦春林)還是很給力啊!一連搞兩個組織(社團 (∩_∩)),那麼還是主要介紹一下妹妹嗨皮吧好啦,說起嗨皮吧還真是有很多吸引人的地方,它有線上和下線兩種模式,可以在嗨皮吧的網站上交流,也可以週末了來我們這裏放鬆、聚會、打牌、寫代碼、蹭網、吃飯等等,嗨皮吧正式啓動第一天還是很給力很多好朋友都來捧場,一起吃飯、打牌、玩遊戲(XBOX)。對了地址是:北京市海淀區西二旗領秀新硅谷A區4樓402室,歡迎大家週末來一起交流!廢話不多說啦。。。。。

         1、應用場景

         開始今天的主題吧,今天的主題是建造者模式,按慣例還是以一個真實的場景來模擬的去描述,還是嗨皮吧(http://happy-bar.com/),嗨皮吧線上活動有一個分享技術的版塊,會根據大家感興趣的技術方向找一些該技術方向的高手、老手來錄製視頻與大家分享,比如:秦春林擅長:WP7、cocos2d-xna,蛋子(張智)擅長:ASP.NET、Oracle!那麼這個時候嗨皮吧線上版塊的嗨客們對最近的WP7版本的遊戲引擎cocos2d-xna很感興趣,我們就會找秦春林(COCOS2D核心開發人員)來爲我們錄製一套關於COCOS2D在WP7手機上游戲開發的視頻。好吧,有代碼模擬一下吧!

         首先,需要有秦春林這個類我們這裏叫:MrQin,有了MrQin這個類就相當於他已經到我們這裏準備錄製節目了,按秦春林錄製節目的習慣,他喜歡:

         第一步:給大家先演示下今天講解內容的效果。方法名:DemonstrationEfect()

         第二步:根據事先準備好的PPT講解原理。方法名:Principle()

         第三步:打開工程分析實現功能的代碼。方法名:AnalysisOfCode()

         那麼秦春林錄製視頻的C#代碼實現如下:

  1. /// <summary>  
  2.    /// 秦春林  
  3.    /// </summary>  
  4.    public class MrQin  
  5.    {  
  6.        /// <summary>  
  7.        /// 演示效果  
  8.        /// </summary>  
  9.        public void DemonstrationEfect()  
  10.        {  
  11.            Console.WriteLine("演示WP7-COCOS2D,遊戲效果!");  
  12.        }  
  13.  
  14.        /// <summary>  
  15.        /// PPT原理講解  
  16.        /// </summary>  
  17.        public void Principle()  
  18.        {  
  19.            Console.WriteLine("PPT講解實現原理");  
  20.        }  
  21.  
  22.        /// <summary>  
  23.        /// 分析代碼  
  24.        /// </summary>  
  25.        public void AnalysisOfCode()  
  26.        {  
  27.            Console.WriteLine("根據原理分析代碼");  
  28.        }  
  29.    }  
             視頻錄製完成後發現還有很多嗨客對ASP.NET + Oracle的WEB項目方面的知識,我們就會找擅長這方面的程序員蛋子(張智)來爲大家錄製一段關於這個技術的視頻,那麼我們還是需要一個類就是張智類,定名爲:MrZhang吧,MrZhang錄製視頻喜歡的流程是:

          第一步(與MrQin一樣):給大家先演示下今天講解內容的效果。方法名:DemonstrationEfect()

          第二步:現場代碼實現。方法名:Coding()

          第三步:分析與回顧關鍵點。AnalysisOfKeyPoints()

          代碼實現如下:

  1. /// <summary>  
  2.     /// 程序員蛋子張智  
  3.     /// </summary>  
  4.     public class MrZhang  
  5.     {  
  6.         /// <summary>  
  7.         /// 演示效果  
  8.         /// </summary>  
  9.         public void DemonstrationEfect()  
  10.         {  
  11.             Console.WriteLine("演示ASP.NET+Oracle Web項目效果!");  
  12.         }  
  13.  
  14.         /// <summary>  
  15.         /// 代碼實現  
  16.         /// </summary>  
  17.         public void Coding()  
  18.         {  
  19.             Console.WriteLine("邊代碼實現邊講解原理!");  
  20.         }  
  21.  
  22.         /// <summary>  
  23.         /// 分析與回顧關鍵點  
  24.         /// </summary>  
  25.         public void AnalysisOfKeyPoints()  
  26.         {  
  27.             Console.WriteLine("分析代碼實現中的關鍵技術點");  
  28.         }  
  29.     }  
         這個時候我們嗨皮吧遇到一個問題,就是每個人的講解方式都有優點,我們需要把每個人講解過程的優點都提取出來融合成一個固定的規範流程,最後我們決定以後所有嗨皮吧的視頻都暫時以一種風格來錄製.

          第一步:給大家先演示下今天講解內容的效果。

          第二步:PPT給大家講解必須的基礎知識與原理

          第三部:代碼實現內容。

          第四部:關鍵點分析。

        那我們如何改造我們上邊的代碼呢?既然我們可以吧一個通用的流程分析出來,將來不管錄製的是WP7的還是ASP.NET還是WCF等,我們都可以以這個流程來錄製,那麼這裏就體現出一種模式的優勢啦,什麼模式? 答:建造者模式。

        2、建造者模式

        建造者模式:將一個複雜對象的構建與他的表示分離,是的同樣的構建過程可以創建不同的表示。

        建造者模式類圖如下:

         指揮者(Dicrector)類:用來包含一個Builder的抽象類,用來表示使用哪個具體的建造者類。

         抽象建造者(Builder)類:用來抽象product類構建的流程。

         具體的建造者(ConcreteBuilder)類:用來實現具體建造產品的細節。

         產品(Product)類:用來承載建造好產品的細節。

        以我們上邊的場景來看,錄製視頻的步驟就是構建過程,我們的視頻就是表示(產品Product),嗨客們和嗨皮吧就是指揮者啦,具體來錄製視頻的高手們就是我們的具體建造者啦!

        上邊場景我們已經將嗨皮吧錄製視頻的統一步驟抽象了出來,那麼我們就先把這個抽象的步驟類實現吧,也就是建造者模式中的抽象建造者(Builder)類

        代碼如下:

  1. /// <summary>  
  2.     /// 抽象建造這類  
  3.     /// </summary>  
  4.     public abstract class VidioBuilder  
  5.     {  
  6.         //定義我們之前抽象好的四個步驟  
  7.         //第一步:給大家先演示下今天講解內容的效果。  
  8.         //第二步:PPT給大家講解必須的基礎知識與原理。  
  9.         //第三步:代碼實現內容。  
  10.         //第四步:關鍵點分析。  
  11.  
  12.         //第一步  
  13.         public abstract void DemonstrationEfect();  
  14.  
  15.         //第二步  
  16.         public abstract void Principle();  
  17.  
  18.         //第三步  
  19.         public abstract void Coding();  
  20.  
  21.         //第四步  
  22.         public abstract void AnalysisOfKeyPoints();  
  23.  
  24.         //獲得視頻  
  25.         public abstract VidioProduct GetVidio();  
  26.     }  
 

        抽象好了通用的流程當然接下來就可以實現具體根據流程來錄製視頻的高手們啦,說要錄製視頻當然少補了視頻這個類了。代碼如下:

  1. /// <summary>  
  2.     /// 視頻類  
  3.     /// </summary>  
  4.     public class VidioProduct  
  5.     {  
  6.         List<string> list = new List<string>();  
  7.           
  8.         /// <summary>  
  9.         /// 添加內容  
  10.         /// </summary>  
  11.         /// <param name="content"></param>  
  12.         public void AddVidioContent(string content)  
  13.         {  
  14.             list.Add(content);  
  15.         }  
  16.  
  17.         /// <summary>  
  18.         /// 播放視頻  
  19.         /// </summary>  
  20.         public void PlayVidio()  
  21.         {  
  22.             Console.WriteLine("視頻內容爲:");  
  23.             foreach (string str in list)  
  24.             {  
  25.                 Console.WriteLine(str);  
  26.             }  
  27.         }  
  28.     }  
         有了視頻類,我們就可以找高手來錄製視頻啦,有請WP7、cocos2d高手秦春林與ASP.NET、Oracle高手張智登場啦。代碼如下:
  1. /// <summary>  
  2.     /// 秦春林  
  3.     /// </summary>  
  4.     public class MrQin : VidioBuilder  
  5.     {  
  6.         VidioProduct vidio = new VidioProduct();  
  7.         /// <summary>  
  8.         /// 演示效果  
  9.         /// </summary>  
  10.         public override void DemonstrationEfect()  
  11.         {  
  12.             vidio.AddVidioContent("演示WP7-COCOS2D,遊戲效果!");  
  13.         }  
  14.  
  15.         /// <summary>  
  16.         /// PPT原理講解  
  17.         /// </summary>  
  18.         public override void Principle()  
  19.         {  
  20.             vidio.AddVidioContent("PPT講解實現原理");  
  21.         }  
  22.  
  23.         /// <summary>  
  24.         /// 代碼實現  
  25.         /// </summary>  
  26.         public override void Coding()  
  27.         {  
  28.             vidio.AddVidioContent("邊代碼實現邊講解原理!");  
  29.         }  
  30.  
  31.         /// <summary>  
  32.         /// 分析與回顧關鍵點  
  33.         /// </summary>  
  34.         public override void AnalysisOfKeyPoints()  
  35.         {  
  36.             vidio.AddVidioContent("分析代碼實現中的關鍵技術點");  
  37.         }  
  38.  
  39.         /// <summary>  
  40.         /// 獲得錄製好的視頻  
  41.         /// </summary>  
  42.         /// <returns></returns>  
  43.         public override VidioProduct GetVidio()  
  44.         {  
  45.             return vidio;  
  46.         }  
  47.     }  
  48.  
  49.     /// <summary>  
  50.     /// 程序員蛋子張智  
  51.     /// </summary>  
  52.     public class MrZhang : VidioBuilder  
  53.     {  
  54.         VidioProduct vidio = new VidioProduct();  
  55.         /// <summary>  
  56.         /// 演示效果  
  57.         /// </summary>  
  58.         public override void DemonstrationEfect()  
  59.         {  
  60.             vidio.AddVidioContent("演示ASP.NET+Oracle Web項目效果!");  
  61.         }  
  62.  
  63.         /// <summary>  
  64.         /// PPT原理講解  
  65.         /// </summary>  
  66.         public override void Principle()  
  67.         {  
  68.             vidio.AddVidioContent("PPT講解實現原理");  
  69.         }  
  70.  
  71.         /// <summary>  
  72.         /// 代碼實現  
  73.         /// </summary>  
  74.         public override void Coding()  
  75.         {  
  76.             vidio.AddVidioContent("邊代碼實現邊講解原理!");  
  77.         }  
  78.  
  79.         /// <summary>  
  80.         /// 分析與回顧關鍵點  
  81.         /// </summary>  
  82.         public override void AnalysisOfKeyPoints()  
  83.         {  
  84.             vidio.AddVidioContent("分析代碼實現中的關鍵技術點");  
  85.         }  
  86.  
  87.         /// <summary>  
  88.         /// 獲得錄製好的視頻  
  89.         /// </summary>  
  90.         /// <returns></returns>  
  91.         public override VidioProduct GetVidio()  
  92.         {  
  93.             return vidio;  
  94.         }  
  95.     }  
 
 

         可見我們邀請的兩位高手都按照我們統一錄製視頻的順序錄制視頻啦,那麼是誰邀請我們的高手呢?當然我們還有一個指揮者啦,指揮者就是我們的嗨客們與嗨皮吧啦,我們來提出需要視頻的類型,代碼如下:

  1. /// <summary>  
  2.     /// 嗨客指揮者  
  3.     /// </summary>  
  4.     public class HappyDirector  
  5.     {  
  6.         public void BuildingVidio(VidioBuilder builder)  
  7.         {  
  8.             //第一步  
  9.             builder.DemonstrationEfect();  
  10.             //第二步  
  11.             builder.Principle();  
  12.             //第三步  
  13.             builder.Coding();  
  14.             //第四步  
  15.             builder.AnalysisOfKeyPoints();  
  16.         }  
  17.     }  
             OK,完事具備,看看Main函數如何調用吧,代碼如下:
  1. static void Main(string[] args)  
  2.        {  
  3.            HappyDirector director = new HappyDirector();  
  4.            VidioBuilder mrQin = new MrQin();  
  5.            VidioBuilder mrZhang = new MrZhang();  
  6.  
  7.            //首先讓秦春林錄製WP7 cocos2d遊戲開發視頻  
  8.            director.BuildingVidio(mrQin);  
  9.            VidioProduct v1 = mrQin.GetVidio();  
  10.            v1.PlayVidio();  
  11.  
  12.            //接下來讓張智錄製 asp.net oracle項目實戰視頻  
  13.            director.BuildingVidio(mrZhang);  
  14.            VidioProduct v2 = mrZhang.GetVidio();  
  15.            v2.PlayVidio();  
  16.         }  
                運行結果如下:
    

      那麼建造者模式就已經完成了,順便再說一下,5月份快樂技術沙龍一週歲將舉辦一次大活動噢,有抽獎環節,歡迎在北京的嗨客們來體驗WP7與WINDOW8的技術交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章