• .NET设计模式(4):建造者模式(Builder Pattern)(转载)


    概述

    在 软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧 烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的 “稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。

    本文通过现实生活中的买KFC的例子,用图解的方式来诠释建造者模式。

    意图

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

    模型图

    .NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    生活中的例子

    生 成器模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。这种模式用于快餐店制作儿童餐。典型的儿童餐包括一个主 食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。无论顾客点的 是汉堡,三名治还是鸡肉,过程都是一样的。柜台的员工直接把主食,辅食和玩具放在一起。这些是放在一个袋子中的。饮料被倒入杯中,放在袋子外边。这些过程 在相互竞争的餐馆中是同样的。

    .NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    实现过程图解

    在这里我们还是以去KFC店买套餐为例子,示意图如下:

    .NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    客户端:顾客。想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择。

    指导者角色:收银员。知道顾客想要买什么样的套餐,并告诉餐馆员工去准备套餐。

    建造者角色:餐馆员工。按照收银员的要求去准备具体的套餐,分别放入汉堡,可乐,薯条等。

    产品角色:最后的套餐,所有的东西放在同一个盘子里面。

    下面开始我们的买套餐过程。

    1.客户创建Derector对象,并用它所想要的Builder对象进行配置。顾客进入KFC店要买套餐,先找到一个收银员,相当于创建了一个指导者对象。这位收银员给出两种套餐供顾客选择:1普通套餐,2黄金套餐。完成的工作如时序图中红色部分所示。

    .NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    程序实现:

     

     1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System;
     2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System.Configuration;
     3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System.Reflection;
     4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页namespace KFC
     6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
     7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// <summary>
     8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// Client 类
     9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// </summary>

    10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public class Client
    11.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    12.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public static void Main(string[] args)
    13.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    14.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            FoodManager foodmanager = new FoodManager();
    15.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    16.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            Builder instance;
    17.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    18.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            Console.WriteLine("Please Enter Food No:");
    19.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    20.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            string No = Console.ReadLine();
    21.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    22.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            string foodType = ConfigurationSettings.AppSettings["No"+No];
    23.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    24.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + foodType);
    25.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    26.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            foodmanager.Construct(instance);
    27.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    28.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    29.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    30.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    产品(套餐)类:

     1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System;
     2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System.Collections;
     3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页namespace KFC
     5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
     6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// <summary>
     7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// Food类,即产品类
     8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// </summary>

     9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public class Food
    10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    11.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Hashtable food = new Hashtable();
    12.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        
    13.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// <summary>
    14.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// 添加食品
    15.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// </summary>
    16.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// <param name="strName">食品名称</param>
    17.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// <param name="Price">价格</param>

    18.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public void Add(string strName,string Price)
    19.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    20.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            food.Add(strName,Price);
    21.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    22.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        
    23.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// <summary>
    24.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// 显示食品清单
    25.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// </summary>

    26.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public void Show()
    27.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    28.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            IDictionaryEnumerator myEnumerator  = food.GetEnumerator();
    29.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            Console.WriteLine("Food List:");
    30.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            Console.WriteLine("------------------------------");
    31.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            string strfoodlist = "";
    32.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            while(myEnumerator.MoveNext())
    33.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            {
    34.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页                strfoodlist = strfoodlist + " " + myEnumerator.Key.ToString();
    35.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页                strfoodlist = strfoodlist + ": " +myEnumerator.Value.ToString();
    36.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            }

    37.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            Console.WriteLine(strfoodlist);
    38.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            Console.WriteLine(" ------------------------------");
    39.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    40.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    41.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    42.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    2. 指导者通知建造器。收银员(指导者)告知餐馆员工准备套餐。这里我们准备套餐的顺序是:放入汉堡,可乐倒入杯中,薯条放入盒中,并把这些东西都放在盘子 上。这个过程对于普通套餐和黄金套餐来说都是一样的,不同的是它们的汉堡,可乐,薯条价格不同而已。如时序图红色部分所示:

    .NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    程序实现:

     

     1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System;
     2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页namespace KFC
     4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
     5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// <summary>
     6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// FoodManager类,即指导者
     7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// </summary>

     8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public class FoodManager
     9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public void Construct(Builder builder)
    11.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    12.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            builder.BuildHamb();
    13.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    14.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            builder.BuildCoke();
    15.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    16.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            builder.BuildChip();
    17.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }
        
    18.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    19.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    20.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    3.建造者处理指导者的要求,并将部件添加到产品中。餐馆员工(建造者)按照收银员要求的把对应的汉堡,可乐,薯条放入盘子中。这部分是建造者模式里面富于变化的部分,因为顾客选择的套餐不同,套餐的组装过程也不同,这步完成产品对象的创建工作。

    程序实现:

     

     1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System;
     2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页namespace KFC
     4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
     5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// <summary>
     6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// Builder类,即抽象建造者类,构造套餐
     7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// </summary>

     8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public abstract class Builder
     9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {    
    10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// <summary>
    11.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// 添加汉堡
    12.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// </summary>

    13.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public abstract void BuildHamb();
    14.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        
    15.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// <summary>
    16.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// 添加可乐
    17.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// </summary>

    18.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public abstract void BuildCoke();
    19.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        
    20.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// <summary>
    21.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// 添加薯条
    22.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// </summary>

    23.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public abstract void BuildChip();
    24.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        
    25.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// <summary>
    26.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// 返回结果
    27.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// </summary>
    28.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        /// <returns>食品对象</returns>

    29.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public abstract Food GetFood();
    30.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    31.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    32.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

     1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System;
     2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页namespace KFC
     4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
     5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// <summary>
     6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// NormalBuilder类,具体构造者,普通套餐
     7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// </summary>

     8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public class NormalBuilder:Builder
     9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        private Food NormalFood = new Food();
    11.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    12.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public override void BuildHamb()
    13.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    14.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            NormalFood.Add("NormalHamb","¥10.50");
    15.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    16.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        
    17.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public override void BuildCoke()
    18.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    19.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            NormalFood.Add("CokeCole","¥4.50");
    20.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    21.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    22.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public override void BuildChip()
    23.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    24.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            NormalFood.Add("FireChips","¥2.00");
    25.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    26.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    27.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public override Food GetFood()
    28.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    29.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            return NormalFood;
    30.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    31.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    32.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    33.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    34.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

     1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System;
     2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页namespace KFC
     4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
     5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// <summary>
     6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// GoldBuilder类,具体构造者,黄金套餐
     7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// </summary>

     8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public class GoldBuilder:Builder
     9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        private Food GoldFood = new Food();
    11.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    12.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public override void BuildHamb()
    13.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    14.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            GoldFood.Add("GoldHamb","¥13.50");
    15.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    16.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        
    17.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public override void BuildCoke()
    18.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    19.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            GoldFood.Add("CokeCole","¥4.50");
    20.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    21.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    22.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public override void BuildChip()
    23.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    24.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            GoldFood.Add("FireChips","¥3.50");
    25.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    26.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    27.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public override Food GetFood()
    28.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    29.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            return GoldFood;
    30.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    31.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    32.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    33.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    34.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    4.客户从建造者检索产品。从餐馆员工准备好套餐后,顾客再从餐馆员工那儿拿回套餐。这步客户程序要做的仅仅是取回已经生成的产品对象,如时序图中红色部分所示。

    .NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    完整的客户程序:

     

     1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System;
     2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System.Configuration;
     3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System.Reflection;
     4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页namespace KFC
     6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
     7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// <summary>
     8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// Client 类
     9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    /// </summary>

    10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public class Client
    11.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    12.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        public static void Main(string[] args)
    13.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    14.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            FoodManager foodmanager = new FoodManager();
    15.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    16.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            Builder instance;
    17.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    18.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            Console.WriteLine("Please Enter Food No:");
    19.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    20.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            string No = Console.ReadLine();
    21.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    22.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            string foodType = ConfigurationSettings.AppSettings["No"+No];
    23.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    24.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + foodType);
    25.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    26.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            foodmanager.Construct(instance);
    27.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    28.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            Food food = instance.GetFood();
    29.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            food.Show();
    30.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    31.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            Console.ReadLine();
    32.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    33.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    34.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    35.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    通过分析不难看出,在这个例子中,在准备套餐的过程是稳定的,即按照一定的步骤去做,而套餐的组成部分则是变化的,有可能是普通套餐或黄金套餐等。这个变化就是建造者模式中的“变化点“,就是我们要封装的部分。

    另外一个例子

    在这里我们再给出另外一个关于建造房子的例子。客户程序通过调用指导者 (CDirector class)BuildHouse()方法来创建一个房子。该方法有一个布尔型的参数blnBackyard,当blnBackyard为假时指导者将创建一个ApartmentConcrete Builder),当它为真时将创建一个Single Family HomeConcrete Builder)。这两种房子都实现了接口Ihouse

    程序实现:

     

      1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页//关于建造房屋的例子
      2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System;
      3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页using System.Collections;
      4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
      5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// <summary>
      6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// 抽象建造者
      7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// </summary>

      8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页public interface IHouse
      9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
     10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    bool GetBackyard();
     11.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    long NoOfRooms();
     12.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    string  Description();
     13.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

     14.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     15.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// <summary>
     16.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// 具体建造者
     17.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// </summary>

     18.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页public class CApt:IHouse
     19.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
     20.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    private bool mblnBackyard;
     21.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    private Hashtable Rooms;
     22.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public CApt()
     23.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
     24.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        CRoom room;    
     25.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Rooms = new Hashtable();
     26.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room = new CRoom();
     27.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room.RoomName = "Master Bedroom";
     28.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Rooms.Add ("room1",room);
     29.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     30.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room = new CRoom();
     31.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room.RoomName = "Second Bedroom";
     32.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Rooms.Add ("room2",room);
     33.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     34.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room = new CRoom();
     35.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room.RoomName = "Living Room";
     36.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Rooms.Add ("room3",room);
     37.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        
     38.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        mblnBackyard = false;
     39.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

     40.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     41.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public bool GetBackyard()
     42.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
     43.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        return mblnBackyard;
     44.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

     45.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public long NoOfRooms()
     46.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
     47.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        return Rooms.Count; 
     48.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

     49.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public string  Description()
     50.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
     51.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        IDictionaryEnumerator myEnumerator  = Rooms.GetEnumerator();
     52.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        string strDescription;
     53.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        strDescription = "This is an Apartment with " + Rooms.Count + " Rooms  ";
     54.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        strDescription = strDescription + "This Apartment doesn't have a backyard  ";                        
     55.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        while (myEnumerator.MoveNext())
     56.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
     57.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            strDescription = strDescription + " " + myEnumerator.Key + " " + ((CRoom)myEnumerator.Value).RoomName;
     58.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

     59.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        return strDescription;
     60.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

     61.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

     62.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     63.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// <summary>
     64.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// 具体建造者
     65.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// </summary>

     66.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页public class CSFH:IHouse
     67.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
     68.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    private bool mblnBackyard;
     69.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    private Hashtable Rooms;
     70.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public CSFH()
     71.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
     72.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        CRoom room;
     73.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Rooms = new Hashtable();
     74.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     75.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room = new CRoom();
     76.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room.RoomName = "Master Bedroom";
     77.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Rooms.Add ("room1",room);
     78.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     79.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room = new CRoom();
     80.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room.RoomName = "Second Bedroom";
     81.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Rooms.Add ("room2",room);
     82.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     83.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room = new CRoom();
     84.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room.RoomName = "Third Room";
     85.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Rooms.Add ("room3",room);
     86.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        
     87.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room = new CRoom();
     88.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room.RoomName = "Living Room";
     89.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Rooms.Add ("room4",room);
     90.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     91.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room = new CRoom();
     92.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        room.RoomName = "Guest Room";
     93.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Rooms.Add ("room5",room);
     94.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     95.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        mblnBackyard = true;
     96.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 
     97.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

     98.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     99.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public bool GetBackyard()
    100.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    101.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        return mblnBackyard;
    102.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    103.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public long NoOfRooms()
    104.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    105.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        return Rooms.Count;
    106.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    107.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public string  Description()
    108.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    109.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        IDictionaryEnumerator myEnumerator  = Rooms.GetEnumerator();
    110.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        string strDescription;
    111.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        strDescription = "This is an Single Family Home with " + Rooms.Count + " Rooms  ";
    112.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        strDescription = strDescription + "This house has a backyard  "
    113.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        while (myEnumerator.MoveNext())
    114.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    115.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            strDescription = strDescription + " " + myEnumerator.Key + " " + ((CRoom)myEnumerator.Value).RoomName; 
    116.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }
          
    117.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        return strDescription;
    118.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    119.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    120.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    121.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页public interface IRoom
    122.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
    123.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    string RoomName{get;set;}
    124.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    125.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    126.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页public class CRoom:IRoom
    127.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
    128.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    private string mstrRoomName;
    129.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public string RoomName
    130.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    131.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        get
    132.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    133.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            return mstrRoomName;
    134.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    135.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        set 
    136.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    137.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            mstrRoomName = value;
    138.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    139.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    140.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    141.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    142.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// <summary>
    143.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// 指导者
    144.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// </summary>

    145.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页public class CDirector
    146.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
    147.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    public IHouse BuildHouse(bool blnBackyard)
    148.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    149.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        if (blnBackyard)
    150.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    151.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            return new CSFH();
    152.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    153.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        else
    154.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        {
    155.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页            return new CApt(); 
    156.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        }

    157.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    158.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    159.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    160.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// <summary>
    161.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// 客户程序
    162.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页/// </summary>

    163.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页public class Client
    164.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页{
    165.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    static void Main(string[] args) 
    166.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    167.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        CDirector objDirector = new CDirector();
    168.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        IHouse objHouse;
    169.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    170.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        string Input = Console.ReadLine();
    171.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        objHouse = objDirector.BuildHouse(bool.Parse(Input));
    172.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    
    173.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Console.WriteLine(objHouse.Description());
    174.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页        Console.ReadLine();
    175.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    }

    176.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页}

    177.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    178.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    建造者模式的几种演化

    省略抽象建造者角色

    系统中只需要一个具体建造者,省略掉抽象建造者,结构图如下:

    .NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    指导者代码如下:

     

     1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 class Director
     2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页  {
     3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   private ConcreteBuilder builder;
     4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 
     5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   public void Construct()
     6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
     7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页     builder.BuildPartA();
     8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页     builder.BuildPartB();
     9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   }

    10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 }

    省略指导者角色

    抽象建造者角色已经被省略掉,还可以省略掉指导者角色。让Builder角色自己扮演指导者与建造者双重角色。结构图如下:

    .NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    建造者角色代码如下:

     

     1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 public class Builder
     2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页  {
     3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   private Product product = new Product();
     4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 
     5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   public void BuildPartA()
     6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    
     7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页     //.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
     8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   }

     9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 
    10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   public void BuildPartB()
    11.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    12.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页     //.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页
    13.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   }

    14.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 
    15.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   public Product GetResult()
    16.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    17.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页     return product;
    18.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   }

    19.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 
    20.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   public void Construct()
    21.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
    22.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页     BuildPartA();
    23.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页     BuildPartB();
    24.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   }

    25.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 }

    客户程序:
     1.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 public class Client
     2.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页  {
     3.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   private static Builder builder;
     4.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 
     5.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   public static void Main()
     6.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页    {
     7.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页     builder = new Builder();
     8.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页     builder.Construct();
     9.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页     Product product = builder.GetResult();
    10.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页   }

    11.NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页 }

    合并建造者角色和产品角色

    建 造模式失去抽象建造者角色和指导者角色后,可以进一步退化,从而失去具体建造者角色,此时具体建造者角色和产品角色合并,从而使得产品自己就是自己的建造 者。这样做混淆了对象的建造者和对象本身,但是有时候一个产品对象有着固定的几个零件,而且永远只有这几个零件,此时将产品类和建造类合并,可以使系统简 单易读。结构图如下:

    .NET设计模式(4):建造者模式(Builder Pattern) - qiuguangchun - sandea的个人主页

    实现要点

    1、建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。

    2产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或者此模式应用于产品的生成过程,其最终结果可能差异很大,不大可能提炼出一个抽象产品类。
    3
    、创建者中的创建子部件的接口方法不是抽象方法而是空方法,不进行任何操作,具体的创建者只需要覆盖需要的方法就可以,但是这也不是绝对的,特别是类似文本转换这种情况下,缺省的方法将输入原封不动的输出是合理的缺省操作。

    4、前面我们说过的抽象工厂模式(Abtract Factory)解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化,建造者模式常和组合模式(Composite Pattern)结合使用。

    效果

    1、建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
    2
    、每一个Builder都相对独立,而与其它的Builder无关。
    3
    、可使对构造过程更加精细控制。

    4、将构建代码和表示代码分开。

    5、建造者模式的缺点在于难于应付“分步骤构建算法”的需求变动。

    适用性

    以下情况应当使用建造者模式:

    1、需要生成的产品对象有复杂的内部结构。
    2
    、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
    3
     在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

    应用场景

    1、   RTF文档交换格式阅读器。

    2、   .NET环境下的字符串处理StringBuilder,这是一种简化了的建造者模式。

    3、   ……

    总结

    建造者模式的实质是解耦组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。
  • 相关阅读:
    c#之字符串,列表,接口,队列,栈,多态
    c#之函数
    KMP算法
    字符串Hash
    洛谷P1807 最长路_NOI导刊2010提高(07)
    洛谷P2863 [USACO06JAN]牛的舞会The Cow Prom
    洛谷P2071 座位安排
    二分图最大匹配,匈牙利算法
    差分约束系统
    搜索
  • 原文地址:https://www.cnblogs.com/sandea/p/3293694.html
Copyright © 2020-2023  润新知