• [设计模式]第四回:建造者模式(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.小结

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

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

  • 相关阅读:
    安装wamp的方法及过程
    js原生获取className&多选一
    构造函数
    轮播图
    NaN
    ++与--运算练习
    if语句的练习
    switch语句的练习
    九九乘法表
    mac下git提交github代码
  • 原文地址:https://www.cnblogs.com/qqlin/p/4153127.html
Copyright © 2020-2023  润新知