• 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();
                }
            }
    
    
           
        }
    
    
  • 相关阅读:
    第九周学习报告
    人月神话阅读笔记02
    数组 分步 详细
    第八周学习总结
    课堂练习
    学习进度报告09
    用户模板和用户场景
    学习进度报告08
    课堂随笔
    学习进度报告07
  • 原文地址:https://www.cnblogs.com/sands/p/11460174.html
Copyright © 2020-2023  润新知