创建型模式之二---Builder

来源:互联网 发布:四大人工智能业务 编辑:程序博客网 时间:2024/05/18 00:14

1、结构图

 

Builder结构图

 

2、代码

/***********************************************************************************
 * 意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
 * 适用性:
 * 1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
 * 2、当构造过程必须允许被构造的对象有不同的表示时。
 * 协作:
 * 1、客户创建Director对象,并用它所想要的Builder对象进行配置;
 * 2、一旦产品部件被生成,导向器(Director)就会通知生成器(Builder);
 * 3、生成器处理导向器的请求,并将部件添加到该产品中;
 * 4、客户从生成器中检索产品。
 * 作者:董怀信
 * 时间:2009-05-26
 ***********************************************************************************/

using System;

namespace DesignPattern.CreationalPattern
{
 
    /// <summary>
    /// 为创建一个Product对象的各个部分指定抽象接口;
    /// </summary>
    public abstract class Builder
    {
        protected string[] m_Object = new string[3];
        public abstract void BuildPartA();

        public abstract void BuildPartB();

        public abstract void BuildPartC();

        public virtual string[] GetResult()
        {
            return new string[0];
        }
    }

    /// <summary>
    /// 实现Builder的接口以构造和装配该产品的各个部分;
    /// 定义并明确他所创建的表示;
    /// 提供一个检索产品的接口。
    /// </summary>
    public class ConcreteBuilder : Builder
    {
        public override void BuildPartA()
        {
            m_Object[0] = "ConcreteBuilder:BuildPartA;";
        }

        public override void BuildPartB()
        {
            m_Object[1] = "ConcreteBuilder:BuildPartB;";
        }
        public override void BuildPartC()
        {
            m_Object[2] = "ConcreteBuilder:BuildPartC;";
        }

        public override string[] GetResult()
        {
            return m_Object;
        }
    }

    /// <summary>
    /// 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程;
    /// 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
    /// </summary>
    public class Director
    {
        public void Construct(Builder builder)
        {
            builder.BuildPartA();
            builder.BuildPartB();
            builder.BuildPartC();
        }
    }


    /// <summary>
    /// 测试代码
    /// </summary>
    public class Client
    {
        public void Test()
        {
            Director d = new Director();
            Builder builder = new ConcreteBuilder();
            d.Construct(builder);
            string[] result = builder.GetResult();
            foreach (string item in result)
            {
                Console.WriteLine(item);
            }
        }
    }
}

原创粉丝点击