首页 > 代码库 > [设计模式]第四回:建造者模式(Builder Pattern)

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

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

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

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

 

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