1.概述

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示,这就是建造者模式。

简单的说就是生产一个产品的步骤比较稳定,单个步骤变化会产生一个不同的产品。

2.实践

物理模型

建造者模式的例子很多,如肯德基套餐,游戏角色人物等等。前一段时间同事辞职去开了一家米线店,开张时我们这些同事都去捧场了,免费午餐,随我们点,菜单发现并不多,只有几种类型的米线,酸辣米线,杂酱米线。

谈话中米线做法,他说相当简单,一开始慢慢试,调出味道,成熟后然后把各个配料的量纪录下来,这样就成为一道米线了,下次直接按照配料量一一加入 即可,各种配料都在这了,就这么多,只是每种配料的量不同,配出不一样的米线。

先定义一个米线产品,成品米线由好多部分组成的

    /// <summary>
    /// 米线产品
    /// </summary>
    public class NoodlesProduct
    {
        List<string> parts = new List<string>();

        public void AddPart(string part)
        {
            parts.Add(part);
        }
        /// <summary>
        /// 展示 米线产品
        /// </summary>
        public void Show()
        {
            foreach (var p in parts)
            {
                Console.WriteLine(p);
            }
        }
    }

接下来就要开始做米线了,米线做的过程都差不多,只是放料多少有所不同,先抽象一个做米线的接口如下:

    /// <summary>
    /// 建造者:这里是用来做米线,假设米线由下面3个部分组成
    /// </summary>
    public interface IBuilder
    {
        /// <summary>
        /// 米线主料
        /// </summary>
        void BuilderNoodles();
        /// <summary>
        /// 酸辣料
        /// </summary>
        void BuilderHotSour();
        /// <summary>
        /// 肉酱料
        /// </summary>
        void BuiderMeat();
        /// <summary>
        /// 获取成功的米线产品
        /// </summary>
        NoodlesProduct GetNoodles();
    }

来个具体的实现,做个酸辣米线

/// <summary>
    /// 酸辣米线制作类
    /// </summary>
    public class BuilderHotSour : IBuilder
    {
        NoodlesProduct noodles = new NoodlesProduct();
        /// <summary>
        /// 主料
        /// </summary>
        public void BuilderNoodles()
        {
            noodles.AddPart("加入米线及油盐味精");
        }
        /// <summary>
        /// 放酸辣
        /// </summary>
        public void BuilderHotSour()
        {
            noodles.AddPart("加入适量辣椒及醋");
        }
        /// <summary>
        /// 肉酱料
        /// </summary>
        public void BuiderMeat()
        {
            noodles.AddPart("加入少量肉酱");
        }
        public NoodlesProduct GetNoodles()
        {
            return noodles;
        }
    }

再来个肉酱米线,类似

    /// <summary>
    /// 肉酱米线制作类
    /// </summary>
    public class BuilderMeat : IBuilder
    {
        NoodlesProduct noodles = new NoodlesProduct();
        /// <summary>
        /// 主料
        /// </summary>
        public void BuilderNoodles()
        {
            noodles.AddPart("加入米线及油盐味精");
        }
        /// <summary>
        /// 放酸辣
        /// </summary>
        public void BuilderHotSour()
        {
            noodles.AddPart("加入微量辣椒及醋或者不加");
        }
        /// <summary>
        /// 肉酱料
        /// </summary>
        public void BuiderMeat()
        {
            noodles.AddPart("加入适量肉酱");
        }
        public NoodlesProduct GetNoodles()
        {
            return noodles;
        }
    }

接下来就是开始客户点餐要告诉客服或者厨师 要什么米线了,做米线都是他们来控制的,他们是一个指导者的角色

    /// <summary>
    /// 指挥者(前台/或者厨师)
    /// </summary>
    public class Director
    {
        public void Construct(IBuilder builder)
        {
            builder.BuilderNoodles();
            builder.BuilderHotSour();
            builder.BuiderMeat();
        }
    }

用户点餐过程如下:

    public class MainClient
    {
        public void Main()
        {
            //客服人员
            Director director = new Director();
            //用户点餐是  酸辣米线
            IBuilder builder = new BuilderHotSour();
            //客服人员告诉厨师开始做米线
            director.Construct(builder);
            //米线 做好
            NoodlesProduct nooodels = builder.GetNoodles();
            //用户得到米线,可验证米线是否少了料
            nooodels.Show();
        }
    }

 

3.小结

客户端不了解具体的制作过程,产品的细节制作被封装隔离,买个汽车,可以关心汽车的各个部件是不是好的,但是没必要知道这个东西怎么建造的。

产品的部分建造可以灵活控制,配料的多少可以制作出不同的产品,如果步骤细分还可以出更多产品,如面料多少可以分大碗 小碗 中碗。

 

posted on 2014-12-24 10:46  Qlin  阅读(707)  评论(1编辑  收藏  举报