• 设计模式之建造者模式



     建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

     组成:
     1、builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
     2、ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
     3、Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
     4、Product:要创建的复杂对象。

     优点:
     1、使用建造者模式可以使客户端不必知道产品内部组成的细节。
     2、具体的建造者类之间是相互独立的,对系统的扩展非常有利。
     3、由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

     缺点:
     1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
     2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
     3、产生了多余的Build对象以及Dirextor对象,消耗了内存。

     与工厂模式对比:
     建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程。

    实现:

    /// <summary>
        /// 要创建的复杂对象
        /// </summary>
        public class Person
        {
            //人组成部分集合
            public List<string> parts;
    
            public Person()
            {
                parts = new List<string>();
            }
    
            /// <summary>
            /// 添加组成部分
            /// </summary>
            /// <param name="_part"></param>
            public void AddPart(string _part)
            {
                parts.Add(_part);
            }
    
            /// <summary>
            /// 展示组成部分
            /// </summary>
            public void Show()
            {
                for (int i = 0; i < parts.Count; i++)
                {
                    Console.WriteLine(parts[i]);
                }
            }
        }
        /// <summary>
        /// 建造者接口
        /// </summary>
        public abstract class Builder
        {
            public Person person;
            public Builder()
            {
                person = new Person();
            }
            public abstract void BuilderHead();
            public abstract void BuilderBody();
            public abstract void BuilderHand();
            public abstract void BuilderFeet();
        }
        /// <summary>
        /// 胖人创建类
        /// </summary>
        public class FatPersonBuilder : Builder
        {
            public override void BuilderBody()
            {
                person.AddPart("胖人身体");
            }
    
            public override void BuilderFeet()
            {
                person.AddPart("胖人脚");
            }
    
            public override void BuilderHand()
            {
                person.AddPart("胖人手");
            }
    
            public override void BuilderHead()
            {
                person.AddPart("胖人头");
            }
        }
        /// <summary>
        /// 瘦人创建类
        /// </summary>
        public class ThinPersonBuilder : Builder
        {
            public override void BuilderBody()
            {
                person.AddPart("瘦人身体");
            }
    
            public override void BuilderFeet()
            {
                person.AddPart("瘦人脚");
            }
    
            public override void BuilderHand()
            {
                person.AddPart("瘦人手");
            }
    
            public override void BuilderHead()
            {
                person.AddPart("瘦人头");
            }
        }
        /// <summary>
        /// 指导者,负责组装
        /// </summary>
        public class Director
        {
            public Person Construct(Builder _builder)
            {
                _builder.BuilderHead();
                _builder.BuilderBody();
                _builder.BuilderHand();
                _builder.BuilderFeet();
                return _builder.person;
            }
        }
        /// <summary>
        /// 客户端类
        /// </summary>
        public class Client
        {
            public static void Main(string[] args)
            {
                Director _director = new Director();
                FatPersonBuilder _fatPersonBuilder = new FatPersonBuilder();
                ThinPersonBuilder _thinPersonBuilder = new ThinPersonBuilder();
    
                Person _person1 = _director.Construct(_fatPersonBuilder);
                _person1.Show();
                Person _person2 = _director.Construct(_thinPersonBuilder);
                _person2.Show();
    
                Console.ReadKey();
            }
        }
  • 相关阅读:
    JavaScript中的setMonth()方法的小问题 解决:setMonth(month, 1)
    Bootstrap的Model源码详细注释 (转)
    中检测到有潜在危险的 Request.Form 值。
    JQuery EasyUI DataGrid获取当前行
    VS 开发必用插件
    C# MVC模式 404 500页面设置方法
    (转)高性能网页开发的14条军规
    (转)mysql百万级以上查询优化
    Win7/Win8安装"我们无法创建新的分区,也找不到现有的分区"的解决方法
    SQL Server2008 删除登录记录
  • 原文地址:https://www.cnblogs.com/xiaoyulong/p/9462971.html
Copyright © 2020-2023  润新知