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


 

         快樂技術沙龍即將一周歲了,最近它又多了個妹妹叫《嗨皮吧》,春哥(秦春林)還是很給力啊!一連搞兩個組織(社團 (∩_∩)),那么還是主要介紹一下妹妹嗨皮吧好啦,說起嗨皮吧還真是有很多吸引人的地方,它有線上和下線兩種模式,可以在嗨皮吧的網站上交流,也可以周末了來我們這里放松、聚會、打牌、寫代碼、蹭網、吃飯等等,嗨皮吧正式啟動第一天還是很給力很多好朋友都來捧場,一起吃飯、打牌、玩游戲(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#代碼實現如下:

    ///   <summary>
    
///  秦春林
    
///   </summary>
     public  class MrQin
    {
         ///   <summary>
        
///  演示效果
        
///   </summary>
         public  void DemonstrationEfect()
        {
            Console.WriteLine( " 演示WP7-COCOS2D,游戲效果! ");
        }

         ///   <summary>
        
///  PPT原理講解
        
///   </summary>
         public  void Principle()
        {
            Console.WriteLine( " PPT講解實現原理 ");
        }

         ///   <summary>
        
///  分析代碼
        
///   </summary>
         public  void AnalysisOfCode()
        {
            Console.WriteLine( " 根據原理分析代碼 ");
        }
    }

          視頻錄制完成后發現還有很多嗨客對ASP.NET + Oracle的WEB項目方面的知識,我們就會找擅長這方面的程序員蛋子(張智)來為大家錄制一段關於這個技術的視頻,那么我們還是需要一個類就是張智類,定名為:MrZhang吧,MrZhang錄制視頻喜歡的流程是:

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

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

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

          代碼實現如下:

///   <summary>
    
///  程序員蛋子張智
    
///   </summary>
     public  class MrZhang
    {
         ///   <summary>
        
///  演示效果
        
///   </summary>
         public  void DemonstrationEfect()
        {
            Console.WriteLine( "演示ASP.NET+Oracle Web項目效果! ");
        }

         ///   <summary>
        
///  代碼實現
        
///   </summary>
         public  void Coding()
        {
            Console.WriteLine( " 邊代碼實現邊講解原理! ");
        }

         ///   <summary>
        
///  分析與回顧關鍵點
        
///   </summary>
         public  void AnalysisOfKeyPoints()
        {
            Console.WriteLine( " 分析代碼實現中的關鍵技術點 ");
        }
    }

         這個時候我們嗨皮吧遇到一個問題,就是每個人的講解方式都有優點,我們需要把每個人講解過程的優點都提取出來融合成一個固定的規范流程,最后我們決定以后所有嗨皮吧的視頻都暫時以一種風格來錄制.

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

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

          第三部:代碼實現內容。

          第四部:關鍵點分析。

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

        2、建造者模式

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

        建造者模式類圖如下:

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

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

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

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

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

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

        代碼如下:

///   <summary>
    
///  抽象建造這類
    
///   </summary>
     public  abstract  class VidioBuilder
    {
         // 定義我們之前抽象好的四個步驟
        
// 第一步:給大家先演示下今天講解內容的效果。
        
// 第二步:PPT給大家講解必須的基礎知識與原理。
        
// 第三步:代碼實現內容。
        
// 第四步:關鍵點分析。

        
// 第一步
         public  abstract  void DemonstrationEfect();

         // 第二步
         public  abstract  void Principle();

         // 第三步
         public  abstract  void Coding();

         // 第四步
         public  abstract  void AnalysisOfKeyPoints();

         // 獲得視頻
         public  abstract VidioProduct GetVidio();
    }

 

 

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

  ///   <summary>
    
///  視頻類
    
///   </summary>
     public  class VidioProduct
    {
        List< string> list =  new List< string>();
        
         ///   <summary>
        
///  添加內容
        
///   </summary>
        
///   <param name="content"></param>
         public  void AddVidioContent( string content)
        {
            list.Add(content);
        }

         ///   <summary>
        
///  播放視頻
        
///   </summary>
         public  void PlayVidio()
        {
            Console.WriteLine( " 視頻內容為: ");
             foreach ( string str  in list)
            {
                Console.WriteLine(str);
            }
        }
    }

        有了視頻類,我們就可以找高手來錄制視頻啦,有請WP7、cocos2d高手秦春林與ASP.NET、Oracle高手張智登場啦。代碼如下:

///   <summary>
    
///  秦春林
    
///   </summary>
     public  class MrQin : VidioBuilder
    {
        VidioProduct vidio =  new VidioProduct();
         ///   <summary>
        
///  演示效果
        
///   </summary>
         public  override  void DemonstrationEfect()
        {
            vidio.AddVidioContent( " 演示WP7-COCOS2D,游戲效果! ");
        }

         ///   <summary>
        
///  PPT原理講解
        
///   </summary>
         public  override  void Principle()
        {
            vidio.AddVidioContent( " PPT講解實現原理 ");
        }

         ///   <summary>
        
///  代碼實現
        
///   </summary>
         public  override  void Coding()
        {
            vidio.AddVidioContent( " 邊代碼實現邊講解原理! ");
        }

         ///   <summary>
        
///  分析與回顧關鍵點
        
///   </summary>
         public  override  void AnalysisOfKeyPoints()
        {
            vidio.AddVidioContent( " 分析代碼實現中的關鍵技術點 ");
        }

         ///   <summary>
        
///  獲得錄制好的視頻
        
///   </summary>
        
///   <returns></returns>
         public  override VidioProduct GetVidio()
        {
             return vidio;
        }
    }

     ///   <summary>
    
///  程序員蛋子張智
    
///   </summary>
     public  class MrZhang : VidioBuilder
    {
        VidioProduct vidio =  new VidioProduct();
         ///   <summary>
        
///  演示效果
        
///   </summary>
         public  override  void DemonstrationEfect()
        {
            vidio.AddVidioContent( " 演示ASP.NET+Oracle Web項目效果! ");
        }

         ///   <summary>
        
///  PPT原理講解
        
///   </summary>
         public  override  void Principle()
        {
            vidio.AddVidioContent( " PPT講解實現原理 ");
        }

         ///   <summary>
        
///  代碼實現
        
///   </summary>
         public  override  void Coding()
        {
            vidio.AddVidioContent( " 邊代碼實現邊講解原理! ");
        }

         ///   <summary>
        
///  分析與回顧關鍵點
        
///   </summary>
         public  override  void AnalysisOfKeyPoints()
        {
            vidio.AddVidioContent( " 分析代碼實現中的關鍵技術點 ");
        }

         ///   <summary>
        
///  獲得錄制好的視頻
        
///   </summary>
        
///   <returns></returns>
         public  override VidioProduct GetVidio()
        {
             return vidio;
        }
    }

 

 

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

     ///   <summary>
    
///  嗨客指揮者
    
///   </summary>
     public  class HappyDirector
    {
         public  void BuildingVidio(VidioBuilder builder)
        {
             // 第一步
            builder.DemonstrationEfect();
             // 第二步
            builder.Principle();
             // 第三步
            builder.Coding();
             // 第四步
            builder.AnalysisOfKeyPoints();
        }
    }

         OK,完事具備,看看Main函數如何調用吧,代碼如下:

        static  void Main( string[] args)
        {
            HappyDirector director =  new HappyDirector();
            VidioBuilder mrQin =  new MrQin();
            VidioBuilder mrZhang =  new MrZhang();

             // 首先讓秦春林錄制WP7 cocos2d游戲開發視頻
            director.BuildingVidio(mrQin);
            VidioProduct v1 = mrQin.GetVidio();
            v1.PlayVidio();

             // 接下來讓張智錄制 asp.net oracle項目實戰視頻
            director.BuildingVidio(mrZhang);
            VidioProduct v2 = mrZhang.GetVidio();
            v2.PlayVidio();
         }

         運行結果如下:
    

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM