• 建筑者模式


    建筑者模式

    • 1.管理者或叫指导者Director(并调具体建筑者去创建产品)
    • 2.建筑者Buidler(抽象类,抽象了生成产品结构化过程)
    • 3.具体建筑者ConcreteBuilder(具体生成产品,实现建筑者)
    • 4.产品Product(产品内部各个部分的构成经常变化)

    描述在软件系统中,经常面临着复杂的对象的创建工作,它通常由各个部分子对象经过一定的算法构成。这个复杂的对象的各个部分经常面临着剧烈的变化,而将它们组合在一起的算法相对稳定。如何应对这种变化?《 建筑者模式》:把复杂对象(Product)内部各个剧烈变化的部分封装(Builder)“隔绝出来”,保持系统“稳定构造算法”不随着需求的变化而变化。
    实现:把复杂的构造和表示相分离,同样的构造过程可以创建不同的表示。

    类图

    流程图

    实际的例子:

          模拟小米手机的生成过程:小米手机分为高端的小米手机和低端的红米手机,生产手机的过程(屏幕+主版+电池等)是相同,所用的材料不相同。

    所有生成的产品

     /// <summary>
        /// 手机类(产品)
        /// </summary>
        public class Mobile
        {
            readonly Dictionary<string,string> _mobel=new Dictionary<string, string>();
    
            public void Add(string partName, string partVal)
            {
                _mobel.Add(partName, partVal);
            }
    
            public void Show()
            {
                Console.WriteLine("这个一台生成完毕的手机,下面是手机的信息");
                var mobileParts = _mobel.GetEnumerator();
                Console.WriteLine(mobileParts.Current.Key+":"+mobileParts.Current.Value);
                while (mobileParts.MoveNext())
                {
                    Console.WriteLine(mobileParts.Current.Key + ":" + mobileParts.Current.Value);
                }
            }
        }
    View Code

    建筑者Builer

       /// <summary>
        /// 手机建造者(抽象的建造者)
        /// </summary>
        public abstract class Builder
        {
            /// <summary>
            /// 生产第一部分
            /// </summary>
            public abstract void PartA();
            /// <summary>
            /// 生产第二个部分
            /// </summary>
            public abstract void PartB();
            /// <summary>
            /// 生产第三个部分
            /// </summary>
            public abstract void PartC();
    
            /// <summary>
            /// 返回产品
            /// </summary>
            /// <returns></returns>
            public abstract Mobile GetProduct();
    
        }
    View Code

    具体建造者

      /// <summary>
        /// 具体建造者(红米手机具体建造者)
        /// </summary>
      public  class ConcreteRedMiBuilder:Builder
        {
          readonly Mobile _mobile=new Mobile();
            public override void PartA()
            {
                _mobile.Add("屏幕","720p");
            }
    
            public override void PartB()
            {
                _mobile.Add("主板", "红米特供");
            }
    
            public override void PartC()
            {
                _mobile.Add("电磁", "2500m");
            }
    
            public override Mobile GetProduct()
            {
                return _mobile;
            }
        }
    View Code
    /// <summary>
        /// 小米手机的具体工厂
        /// </summary>
      public  class ConcreteSmillMiBuilder:Builder
        {
          private Mobile _mobile=new Mobile();
            public override void PartA()
            {
                _mobile.Add("屏幕","1080p");
            }
    
            public override void PartB()
            {
                _mobile.Add("主板", "小米特供");
            }
    
            public override void PartC()
            {
                _mobile.Add("电池", "3100m");
            }
    
            public override Mobile GetProduct()
            {
                return _mobile;
            }
        }
    View Code

    管理者

    /// <summary>
        /// 管理者
        /// </summary>
        public class Director
        {
            /// <summary>
            /// 执行手机生产的各个部分
            /// </summary>
            /// <param name="builder"></param>
            public void Construct(Builder builder)
            {
                builder.PartA();
                builder.PartB();
                builder.PartC();
            }
        }
    View Code

    最后是客户端调用代码

        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("请输入产品的编码
    1红米
    2小米");
                string no =Console.ReadLine();
                string builderName = ConfigurationSettings.AppSettings["No" + no];
                Builder.Builder instance =
                    (Builder.Builder)Assembly.Load("Builder").CreateInstance("Builder." + builderName);
                Director director=new Director();
                director.Construct(instance);
                Mobile mobile = instance.GetProduct();
    
                mobile.Show();
                Console.ReadLine();
    
            }
        }
    View Code

    项目的代码:建造者模式.zip

  • 相关阅读:
    HTML基础 meta refresh 网页定时刷新
    HTML基础 meta name author 添加网页作者的信息
    HTML基础 mate refresh 5秒钟后,页面自动跳转
    HTML基础 marquee div块实现循环跑马灯的效果
    微服务jar包启动脚本
    怎么实现将word中的公式导入(或粘贴)到在线编辑中
    怎么实现将word中的公式导入(或粘贴)到网页编辑中
    Nginx实现浏览器端大文件分块上传
    javascript实现浏览器端大文件分块上传
    js实现浏览器端大文件分块上传
  • 原文地址:https://www.cnblogs.com/Blogs-Wang/p/6412148.html
Copyright © 2020-2023  润新知