天天看點

樂在其中設計模式(C#) - 建造者模式(Builder Pattern)

樂在其中設計模式(C#) - 建造者模式(Builder Pattern)

介紹

将一個複雜對象的建構與它的表示分離,使得同樣的建構過程可以建立不同的表示。

示例

用同樣的建構過程建立Sql和Xml的Insert()方法和Get()方法。

MessageModel

using System; 

using System.Collections.Generic; 

using System.Text; 

namespace Pattern.Builder 

        /// <summary> 

        /// Message實體類 

        /// </summary> 

        public class MessageModel 

        { 

                /// <summary> 

                /// 構造函數 

                /// </summary> 

                /// <param name="msg">Message内容</param> 

                /// <param name="pt">Message釋出時間</param> 

                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

        /// Sql方式操作Message 

        public class SqlMessage 

                /// 擷取Message 

                /// <returns></returns> 

                public List<MessageModel> Get() 

                        List<MessageModel> l = new List<MessageModel>(); 

                        l.Add(new MessageModel("SQL方式擷取Message", DateTime.Now)); 

                        return l; 

                /// 插入Message 

                /// <param name="mm">Message實體對象</param> 

                public bool Insert(MessageModel mm) 

                        // 代碼略 

                        return true; 

XmlMessage

        /// Xml方式操作Message 

        public class XmlMessage 

                        l.Add(new MessageModel("XML方式擷取Message", DateTime.Now)); 

Operation

using System.Reflection; 

        /// 操作(Product) 

        public class Operation 

                private string _type; 

                private Dictionary<string, string> _dictionary; 

                /// <param name="type">産品類型</param> 

                public Operation(string type) 

                        _dictionary = new Dictionary<string, string>(); 

                        this._type = type; 

                /// 索引器 

                /// <param name="key"></param> 

                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<MessageModel> m = (List<MessageModel>)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 + "的執行結果:<br />" + b.ToString() + "<br />" + m[0].Message + " "+ m[0].PublishTime.ToString() + "<br />"; 

AbstractMessageBuilder

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

        public abstract class AbstractMessageBuilder 

                public AbstractMessageBuilder(string type) 

                        this._operation = new Operation(type); 

                /// 操作(Product) 

                protected Operation _operation; 

                public Operation Operation 

                        get { return _operation; } 

                        set { _operation = value; } 

                /// 建造插入方法 

                /// <param name="mm"></param> 

                abstract public void BuilderInsert(MessageModel mm); 

                /// 建造擷取方法 

                abstract public void BuilderGet(); 

SqlMessageBuilder

        /// SqlMessage建造者(ConcreteBuilder) 

        public class SqlMessageBuilder : AbstractMessageBuilder 

                public SqlMessageBuilder() 

                        : base("sql") 

                /// 建造Sql插入方法 

                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

        /// XmlMessage建造者(ConcreteBuilder) 

        public class XmlMessageBuilder : AbstractMessageBuilder 

                public XmlMessageBuilder() 

                        : base("xml") 

                /// 建造Xml插入方法 

                        base._operation["insert"] = "XmlMessage|Insert|"+mm.Message+"|"+mm.PublishTime.ToString()+""; 

                /// 建造Xml擷取方法 

                        base._operation["get"] = "XmlMessage|Get"; 

Message

        /// 指導者(Director) 

        public class Message 

                /// 調用具體建造者角色以建立産品對象 

                /// <param name="messageBuilder">AbstractMessageBuilder</param> 

                public void Construct(AbstractMessageBuilder messageBuilder, MessageModel mm) 

                        messageBuilder.BuilderInsert(mm); 

                        messageBuilder.BuilderGet(); 

client

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(); 

運作結果

類型為sql的執行結果:

True

SQL方式擷取Message 2007-5-5 20:53:28

類型為xml的執行結果:

XML方式擷取Message 2007-5-5 20:53:28

參考

<a href="http://www.dofactory.com/Patterns/PatternBuilder.aspx" target="_blank">http://www.dofactory.com/Patterns/PatternBuilder.aspx</a>

OK

<a href="http://down.51cto.com/data/100859" target="_blank">[源碼下載下傳]</a>

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/344490,如需轉載請自行聯系原作者