建造者模式-Builder Pattern


声明:引自http://myqiao.cnblogs.com/archive/2005/07/30/203438.html#203618


建造者模式-Builder Pattern -领导者艺术-乾隆、和申、纪晓岚的故事
前言:我也是初学者,希望大家能提出意见。另外转载请注明作者和出处,毕竟花了快一周的时间才完成。

这个模式和领导有什么关系吗?有!

在Builder 模式中,有一个很重要的类叫做 Director ,他就是领导者,对应我们现实生活中的经理、包工头、国王等等。别小看他,他自己从不干活,只是发号施令,然后交代给自己的手下去干。

那又和艺术有什么关系呢?当然也有!

在Builder 模式中,还有另一些很重要的类叫做 Builder ,他们是专门干活的,经理对应员工们、包工头对应民工们、国王对应大臣们等等。他们在领导眼里每个人都是一样的,就是说同一件事情交给谁干都可以。

这就和艺术扯上关系了,有这么多手下到底选哪一个呢?每个手下都能干活,但是同一件事情交个不同的两个人去干,很可能就会得到不同的结果,请看下面乾隆、和申、纪晓岚的故事......

话说乾隆初年,格尔丹蠢蠢欲动,乾隆为了赢得时间做好战争动员想使个缓兵之计,准备派一名大臣给格尔丹送去黄金万两、美女一名,以示诚意。问题是派谁去呢?手下有两个大臣都可以担当此重任,一名是军机大臣和申,另一个我不说你也知道,当然就是大学士纪晓岚了。对乾隆来说,让谁去都一样,但实际上呢?

场景一,和申当选钦差大臣,私吞黄金和美女,导致战祸。

场景二,纪晓岚当选钦差大臣,把黄金散给了老百姓,把美女送给了格尔丹,格尔丹中计。

下面我们用 C# 来描述这段故事,从中来体会 Builder 模式的内涵。

 客户端


using System;
 
namespace Builder
{
    class Client
    {
        [STAThread]
        static void Main(string[] args)
        {
            King Qianlong = new King();
 
            //派和申为钦差
            Qianlong.SelectMinister(new HeShen());
            Qianlong.Do();
            Qianlong.Result();
 
            Console.WriteLine("============================================");
            Console.WriteLine ();
 
            //派纪晓岚为钦差
            Qianlong.SelectMinister(new Jixiaolan());
            Qianlong.Do();
            Qianlong.Result();
            Console.Read();
        }
    }
}

Builder 模式类

using System;
 
namespace Builder
{
    /**//// <summary>
    /// 发号施令的家伙,皇帝
    /// 顺便说一下,皇帝可不好当呀,重用哪个大臣可关系的江山社稷的安危呀!
    /// </summary>
    public class King
    {
        private Minister minister;
 
        public King()
        {
        }
 
        //选择一个大臣
        public void SelectMinister(Minister minister)
        {
            this.minister=minister;
        }
 
        //给大臣交待任务,让大臣干活
        //注意:在皇帝眼里,所有大臣都是一样的
        //这个活只要是大臣都能干,我去都行,但是干出来的结果可不一样
        public void Do()
        {
            Console.WriteLine("圣旨:派{0}为钦差大臣出使蒙古,为格尔丹送去黄金和美女!",minister.Name);
            Console.WriteLine();
 
            minister.DeliverGold(10000);
            minister.DeliverPrincess("兰齐儿格格");
        }
 
        //让大臣汇报一下情况吧
        public void Result()
        {
            Console.WriteLine(minister.Result());
            Console.WriteLine();
            Console.WriteLine();
        }
    }
 
 
    /**//// <summary>
    /// 抽象的大臣
    /// </summary>
    public interface Minister
    {
        string Name
        {
            get;
        }
 
        //护送黄金
        void DeliverGold(int i);
 
        //护送美女公主
        void DeliverPrincess(string name);
 
        //向皇帝汇报情况
        string Result();
    }
 
    /**//// <summary>
    /// 具体的大臣:和申
    /// </summary>
    public class HeShen:Minister
    {
        private string name="军机大臣和申";
    
        public void DeliverGold(int i)
        {
            Console.WriteLine("和申收到黄金一万两以后.");
            Console.WriteLine();
            Console.WriteLine("和申:黄金{0}两啊,我一辈子也挣不来阿,他妈的,一不做二不休!",i);
            Console.WriteLine("和申:来人啊,把这些金子全部放到我的仓库里去,换成500两白银送给格尔丹");
            Console.WriteLine();
        }
    
        public void DeliverPrincess(string name)
        {
            Console.WriteLine("和申收到美女一名以后.");
            Console.WriteLine();
            Console.WriteLine("和申:{0}真是美若天仙呀,这样的美人送给格尔丹岂不是糟蹋了!",name);
            Console.WriteLine("和申:这样吧,把{0}留下做我的九姨太,让三姨太冒充格格送给格尔丹不就行了,嘿嘿!",name);
            Console.WriteLine();
        }
    
        public string Result()
        {
            string result="和申又发了一笔,大清国和格尔丹开战战败,清朝灭亡!";
            return result;
        }
    
        public string Name
        {
            get
            {
                return this.name;
            }
        }
    }
 
 
    /**//// <summary>
    /// 具体的大臣:纪晓岚
    /// </summary>
    public class Jixiaolan:Minister
    {
        private string name="大学士纪晓岚";
    
        public void DeliverGold(int i)
        {
            Console.WriteLine("纪晓岚收到黄金一万两以后.");
            Console.WriteLine();
            Console.WriteLine("纪晓岚:黄金{0}两啊,多少老百姓的血汗呀!",i);
            Console.WriteLine("纪晓岚:来人啊,把这些金子拿出一半来分给老百姓,剩下的给格尔丹!");
            Console.WriteLine();
        }
    
        public void DeliverPrincess(string name)
        {
            Console.WriteLine("纪晓岚收到美女一名以后.");
            Console.WriteLine();
            Console.WriteLine("纪晓岚:{0}是金枝玉叶,一路上千万要小心呀!!",name);
            Console.WriteLine("纪晓岚:终于到达蒙古国,格尔丹见到美女很高兴,连钱都不要了,我的任务完成了!");
            Console.WriteLine();
        }
    
        public string Result()
        {
            string result="纪晓岚顺利完成任务,大清国赢得了准备时间,消灭了格尔丹!";
            return result;
        }
    
        public string Name
        {
            get
            {
                return this.name;
            }
        }
    }
 
 
}
 

运行结果如下图:
 

总结:Builder 模式就是一个 Director (指导者)在好几个 Builder(建造者,或者说干活的人)挑选出一个,让他去完成一个任务,同时 Director 给出了完成这个任务的大体思路和框架(要不然怎么叫 Director 呢?),有的情况下也给出一些条件,就像本例子中的黄金和美女。具体这个任务怎么完成就看被选中的那个 Builder 的本事了!

原文地址:https://www.cnblogs.com/kuailewangzi1212/p/665296.html