设计模式--建造者模式

来源:岁月联盟 编辑:exp 时间:2012-04-01

快乐技术沙龙即将一周岁了,最近它又多了个妹妹叫《嗨皮吧》,春哥(秦春林)还是很给力啊!一连搞两个组织(社团 (∩_∩)),那么还是主要介绍一下妹妹嗨皮吧好啦,说起嗨皮吧还真是有很多吸引人的地方,它有线上和下线两种模式,可以在嗨皮吧的网站上交流,也可以周末了来我们这里放松、聚会、打牌、写代码、蹭网、吃饭等等,嗨皮吧正式启动第一天还是很给力很多好朋友都来捧场,一起吃饭、打牌、玩游戏(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.         /// 代码实现 www.2cto.com  
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.         } 
                运行结果如下:

  /

那么建造者模式就已经完成了 。


作者  王波洋