建造者模式(Builder Pattern)
作者:webabcd介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。示例用同样的构建过程创建Sql和Xml的Insert()方法和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<string, string> _dictionary; /// /// 构造函数 /// /// 产品类型 public Operation(string type) { _dictionary = new Dictionary<string, string>(); 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的执行结果:TrueSQL方式获取Message 2007-5-5 20:53:28类型为xml的执行结果:TrueXML方式获取Message 2007-5-5 20:53:28参考http://www.dofactory.com/Patterns/PatternBuilder.aspx
建造者模式(Builder Pattern)