建造者模式(Builder Pattern)

发布时间:2013-07-09 14:43:26

建造者模式(Builder Pattern)



作者:webabcd


介绍
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


示例
用同样的构建过程创建SqlXmlInsert()方法和Get()方法。



MessageModel

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Builder
{
    /// 


    /// Message实体类
    /// 

    public class MessageModel
    {
        /// 
        /// 构造函数
        /// 

        /// Message内容
        /// Message发布时间
        public MessageModel(string msg, DateTime pt)
        {
            this._message = msg;
            this._publishTime = pt;
        }

        private string _message;
        /// 
        /// Message内容
        /// 

        public string Message
        {
            get { return _message; }
            set { _message = value; }
        }

        private DateTime _publishTime;
        /// 
        /// Message发布时间
        /// 

        public DateTime PublishTime
        {
            get { return _publishTime; }
            set { _publishTime = value; }
        }
    }
}


SqlMessage

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Builder
{
    /// 


    /// Sql方式操作Message
    /// 

    public class SqlMessage
    {
        /// 
        /// 获取Message
        /// 

        /// 
        public List Get()
        {
            List l = new List();
            l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));

            return l;
        }

        /// 
        /// 插入Message
        /// 

        /// Message实体对象
        /// 
        public bool Insert(MessageModel mm)
        {
            // 代码略
            return true;
        }
    }
}


XmlMessage

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Builder
{
    /// 


    /// Xml方式操作Message
    /// 

    public class XmlMessage
    {
        /// 
        /// 获取Message
        /// 

        /// 
        public List Get()
        {
            List l = new List();
            l.Add(new MessageModel("XML方式获取Message", DateTime.Now));

            return l;
        }

        /// 
        /// 插入Message
        /// 

        /// Message实体对象
        /// 
        public bool Insert(MessageModel mm)
        {
            // 代码略
            return true;
        }
    }
}


Operation

using System;
using System.Collections.Generic;
using System.Text;

using System.Reflection;

namespace Pattern.Builder
{
    /// 


    /// 操作(Product
    /// 

    public class Operation
    {
        private string _type;
        private Dictionary<stringstring> _dictionary;

        /// 
        /// 构造函数
        /// 

        /// 产品类型
        public Operation(string type)
        {
            _dictionary = new Dictionary<stringstring>();
            this._type = type;
        }

        /// 
        /// 索引器
        /// 

        /// 
        /// 
        public string this[string key]
        {
            get { return _dictionary[key]; }
            set { _dictionary[key] = value; }
        }

        /// 
        /// 获得结果
        /// 

        /// 
        public string GetResult()
        {
            Assembly assembly = Assembly.Load("Pattern.Builder");

            MethodInfo methodGet = assembly.GetType("Pattern.Builder." + _dictionary["get"].Split('|')[0]).GetMethod(_dictionary["get"].Split('|')[1]);
            object objGet = methodGet.Invoke(assembly.CreateInstance("Pattern.Builder." + _dictionary["get"].Split('|')[0]), null);
            List m = (List)objGet;
            
            MethodInfo methodInsert = assembly.GetType("Pattern.Builder." + _dictionary["insert"].Split('|')[0]).GetMethod(_dictionary["insert"].Split('|')[1]);
            object objInsert = methodInsert.Invoke(assembly.CreateInstance("Pattern.Builder." + _dictionary["insert"].Split('|')[0]), new object[] { new MessageModel(_dictionary["insert"].Split('|')[2], Convert.ToDateTime(_dictionary["insert"].Split('|')[3])) });
            bool b = (bool)objInsert;

            return "类型为" + this._type + "的执行结果:" + b.ToString() + "" + m[0].Message + " " + m[0].PublishTime.ToString() + "";
        }
    }
}


AbstractMessageBuilder

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Builder
{
    /// 


    /// 抽象Message建造者(Builder
    /// 

    public abstract class AbstractMessageBuilder
    {
        /// 
        /// 构造函数
        /// 

        /// 产品类型
        public AbstractMessageBuilder(string type)
        {
            this._operation = new Operation(type);
        }

        /// 
        /// 操作(Product
        /// 

        protected Operation _operation;
        /// 
        /// 操作(Product
        /// 

        public Operation Operation
        {
            get { return _operation; }
            set { _operation = value; }
        }

        /// 
        /// 建造插入方法
        /// 

        /// 
        abstract public void BuilderInsert(MessageModel mm);

        /// 
        /// 建造获取方法
        /// 

        abstract public void BuilderGet();
    }
}


SqlMessageBuilder

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Builder
{
    /// 


    /// SqlMessage建造者(ConcreteBuilder
    /// 

    public class SqlMessageBuilder : AbstractMessageBuilder
    {
        /// 
        /// 构造函数
        /// 

        public SqlMessageBuilder()
            : base("sql")
        {
 
        }

        /// 
        /// 建造Sql插入方法
        /// 

        /// Message实体对象
        public override void BuilderInsert(MessageModel mm)
        {
            base._operation["insert"] = "SqlMessage|Insert|" + mm.Message + "|" + mm.PublishTime.ToString() + "";
        }

        /// 
        /// 建造Sql获取方法
        /// 

        public override void BuilderGet()
        {
            base._operation["get"] = "SqlMessage|Get";
        }
    }
}


XmlMessageBuilder

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Builder
{
    /// 


    /// XmlMessage建造者(ConcreteBuilder
    /// 

    public class XmlMessageBuilder : AbstractMessageBuilder
    {
        /// 
        /// 构造函数
        /// 

        public XmlMessageBuilder()
            : base("xml")
        {
 
        }

        /// 
        /// 建造Xml插入方法
        /// 

        /// Message实体对象
        public override void BuilderInsert(MessageModel mm)
        {
            base._operation["insert"] = "XmlMessage|Insert|"+mm.Message+"|"+mm.PublishTime.ToString()+"";
        }

        /// 
        /// 建造Xml获取方法
        /// 

        public override void BuilderGet()
        {
            base._operation["get"] = "XmlMessage|Get";
        }
    }
}


Message

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Builder
{
    /// 


    /// 指导者(Director
    /// 

    public class Message
    {
        /// 
        /// 调用具体建造者角色以创建产品对象
        /// 

        /// AbstractMessageBuilder
        /// Message实体对象
        public void Construct(AbstractMessageBuilder messageBuilder, MessageModel mm)
        {
            messageBuilder.BuilderInsert(mm);
            messageBuilder.BuilderGet();
        }
    }
}



client

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using Pattern.Builder;

public partial class Builder : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Message m = new Message();

        AbstractMessageBuilder amb = new SqlMessageBuilder();
        m.Construct(amb, new MessageModel("插入", DateTime.Now));

        Response.Write(amb.Operation.GetResult());

        amb = new XmlMessageBuilder();
        m.Construct(amb, new MessageModel("插入", DateTime.Now));

        Response.Write(amb.Operation.GetResult());
    }
}


运行结果
类型为sql的执行结果:
True
SQL方式获取Message 2007-5-5 20:53:28
类型为xml的执行结果:
True
XML方式获取Message 2007-5-5 20:53:28


参考
http://www.dofactory.com/Patterns/PatternBuilder.aspx

建造者模式(Builder Pattern)

相关推荐