樂在其中設計模式(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
{ return _publishTime; }
{ _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]
{ return _dictionary[key]; }
{ _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
{ return _operation; }
{ _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://files.cnblogs.com/webabcd/Pattern.rar">[源碼下載下傳]</a>