• 建造者模式(Bulider)


    知识点回顾

    1. 将一个复杂对象的构建与他的表示分离(初始多个成员值并返回这个对象),使得同样的构建过程可以创建不同的表示时,使用建造者模式。

    2. 使用建造者模式,用户只需要指定建造的类型就可以得到他们,而具体建造的过程和细节不需要知道,他们被封装在具体的建造类中,扩展具体建造类来丰富建造的特例。

    3. 指挥者(Director)类,用来控制建造过程,也用它来隔离用户与建造过程的关联,指挥者类是用户设置并用来创建的工具。

    4. 建造者模式和策略模式用到的操作有些相似,指挥者封装的建造方法(在策略模式里面是策略方法)并提供了设置这个指挥者要建造的具体建造类。image

    5. 上图中,Builder是为类创建Product对象的各个步骤指定的抽象接口,用于为多个具体创建抽象高层。他所定义的是抽象了具体(子类)创建某个对象 比如 Product 的 “外观方法”抽象。

    6. ConcreteBuilder 是具体的建造者,实现Builder父类接口,构造和装配特定的各个部件的参数值。Product值的等待装配的对象定义类,就是客户要的对象。

    7. Director构建一个使用Builder 的接口,用来提供协调当前要创建的具体对象的操作,通过设置“具体建造类”(Builder的子类),从而创建不同的需求结果。

    8. 当创建一个复杂的对象,这些对象内部构造结构是不变的也就是出自一个类,但对象内部的成员内容及构造的顺序多变,可以使用建造者模式。

    9. 建造者模式的好处就是使得建造代码(Builder 子类)与表示代码(Director)分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需再定一个具体的建造者就可以了。

    10. 建造者模式是在当要创建复杂对象,该对象的组成部分以及他们的装配方式多变时适用的模式

    示例代码

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace 建造者模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                Director director = new Director();
                Builder b1 = new ConcreteBuilder1();
                Builder b2 = new ConcreteBuilder2();
    
                director.Construct(b1);
                Product p1 = b1.GetResult();//返回建造对象
                p1.Show();
    
                director.Construct(b2);
                Product p2 = b2.GetResult();
                p2.Show();
    
                Console.Read();
            }
        }
    
        class Director
        {
            public void Construct(Builder builder)
            {
                //装配步骤
                builder.BuildPartA();
                builder.BuildPartB();
            }
        }
    
        /// <summary>
        /// 构建类中包含构建步骤及返回构建好的对象
        /// </summary>
        abstract class Builder
        {
            public abstract void BuildPartA();
            public abstract void BuildPartB();
            public abstract Product GetResult();
        }
    
        class ConcreteBuilder1 : Builder
        {
            private Product product = new Product();
    
            public override void BuildPartA()
            {
                product.Add("部件A");
            }
    
            public override void BuildPartB()
            {
                product.Add("部件B");
            }
    
            public override Product GetResult()
            {
                return product;
            }
        }
    
        class ConcreteBuilder2 : Builder
        {
            private Product product = new Product();
            public override void BuildPartA()
            {
                product.Add("部件X");
            }
    
            public override void BuildPartB()
            {
                product.Add("部件Y");
            }
    
            public override Product GetResult()
            {
                return product;
            }
        }
    
        class Product
        {
            IList<string> parts = new List<string>();//被建造的对象中包含列表,代表组件集合
    
            public void Add(string part)
            {
                parts.Add(part);
            }
    
            public void Show()
            {
                Console.WriteLine("\n产品 创建 ----");
                foreach (string part in parts)
                {
                    Console.WriteLine(part);
                }
            }
        }
    
    
    }
    冯瑞涛
  • 相关阅读:
    AVFrame中data与linesize关系
    使用gprof2dot和graphivz生成程序运行调用图
    C/C++ 数组复制
    32位和64位系统区别及int字节数
    ffmpeg中AVPacket与AVFrame中数据的传递与释放
    C/C++输入一行每隔一个空格一个数据
    为什么软件项目需要架构设计?
    绘制函数调用图(call graph):doxygen + graphviz
    复制解码的 ffmpeg AVFrame
    360文档卫士——防勒索,通过即时的预警监测机制,360文档卫士能够“自动备份”您的文档。只要“监测到文档产生任何编辑或动作”,360文档卫士便会!!自动存取!!最新版本
  • 原文地址:https://www.cnblogs.com/finehappy/p/1615283.html
Copyright © 2020-2023  润新知