建造者模式(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);
            }
        }
    }


}
冯瑞涛
原文地址:https://www.cnblogs.com/finehappy/p/1615283.html