[设计模式]第四回:建造者模式(Builder Pattern)

1.概述

将一个复杂的构建与其表示相分离,使得一样的构建过程能够建立不一样的表示,这就是建造者模式。ide

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

2.实践

物理模型spa

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

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

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

    /// <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();
    }

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

/// <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;
        }
    }

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

    /// <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.小结

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

产品的部分建造能够灵活控制,配料的多少能够制做出不一样的产品,若是步骤细分还能够出更多产品,如面料多少能够分大碗 小碗 中碗。

相关文章
相关标签/搜索