Builder建造者模式

目标:将一个复杂对象的构建与表示分离,使同样的构建过程可以创建不同的表示。
使用场景:典型的KFC儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。
优点:

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

实现:

  • Builder:抽象建造者。他声明为创建一个Product对象的各个部件指定的抽象接口。
  • ConcreateBuilder:具体建造者。实现抽象接口,构建和装配各个部件。
  • Director:指挥者。构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
  • Product:产品角色。一个具体的产品对象。
    image.png
public class BuilderTest
    {
        /***
        * 抽象的建造者只关心对象有哪些步骤,
        * 具体的建造者只关心如何实现每一个具体的步骤,
        * 指挥者只关心构建的顺序,
        * 三方各司其职,很好的隔离了构建对象的步骤和顺序,
        * 一但指挥者和建造者确定了,开发者只需要关心如何实现和更新具体步骤就行了,
        */
        public static void Test()
        {
            Builder builder1 = new ConcreteBuilder();
            Director director = new Director(builder1);
            director.Consttruct();
            var product = builder1.GetResult();
            product.Show();
        }


        /// <summary>
        /// 抽象的建造者,定义了建造者的执行步骤
        /// </summary>
        public abstract class Builder
        {
            /// <summary>
            /// 构建的步骤
            /// </summary>
            public abstract void BuidPart1();
            public abstract void BuidPart2();
            public abstract void BuidPart3();

            /// <summary>
            /// 构建完成后的
            /// </summary>
            /// <returns></returns>
            public abstract Product GetResult();
        }
        /// <summary>
        /// 具体的建造者
        /// </summary>
        public class ConcreteBuilder : Builder
        {
            Product product;

            public ConcreteBuilder()
            {
                product = new Product();
            }
            /// <summary>
            /// 具体实现构建产品的步骤
            /// </summary>
            public override void BuidPart1()
            {
                product.AddPart("步骤1");
            }

            public override void BuidPart2()
            {
                product.AddPart("步骤2");
            }

            public override void BuidPart3()
            {
                product.AddPart("步骤3");
            }

            /// <summary>
            /// 返回构建完成的产品
            /// </summary>
            /// <returns></returns>
            public override Product GetResult()
            {
                return product;
            }
        }

        /// <summary>
        /// 产品
        /// </summary>
        public class Product
        {
            public List<string> parts;

            public Product()
            {
                this.parts = new List<string>();
            }

            /// <summary>
            /// 安装零件
            /// </summary>
            /// <param name="part"></param>
            public void AddPart(string part)
            {
                this.parts.Add(part);
            }

            /// <summary>
            /// 展示产品
            /// </summary>
            public void Show()
            {
                this.parts.ForEach(p => Console.WriteLine(p));
            }
        }



        /// <summary>
        /// 指挥者 指挥某个建造者按照一定的顺序组装产品
        /// </summary>
        public class Director
        {
            Builder builder;

            /// <summary>
            /// 和 builder是 聚合关系,builder是观察者的一个组成部分
            /// </summary>
            /// <param name="builder"></param>
            public Director(Builder builder)
            {
                this.builder = builder;
            }

            /// <summary>
            /// 指挥者开始建造
            /// </summary>
            public void Consttruct()
            {
                //定义建造者的建造顺序
                builder.BuidPart1();
                builder.BuidPart3();
                builder.BuidPart2();
            }
        }


       
    }

posted @ 2019-09-04 16:58  sands  阅读(151)  评论(0编辑  收藏  举报