NRE的编程笔记

导航

设计模式之建造者模式


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

 组成:
 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();
        }
    }

 

posted on 2018-08-12 14:35  NRE  阅读(204)  评论(0编辑  收藏  举报