[索引页] [源码下载]

乐在其中设计模式(C#) – 建造者模式(Builder Pattern)

作者:webabcd

介绍
拿一个繁杂对象的构建与她的意味分离,使得同一的构建过程可以创造不同之表示。

示例
据此平等的构建过程创建Sql和Xml的Insert()方法和Get()方法。
XML 1

MessageModel

XML 2using System;
XML 3using System.Collections.Generic;
XML 4using System.Text;
XML 5
XML 6namespace Pattern.Builder
XML 7XML 8XML 9{
XML 10XML 11    /**//// <summary>
XML 12    /// Message实体类
XML 13    /// </summary>
XML 14    public class MessageModel
XML 15XML 16    XML 17{
XML 18XML 19        /**//// <summary>
XML 20        /// 构造函数
XML 21        /// </summary>
XML 22        /// <param name=”msg”>Message内容</param>
XML 23        /// <param name=”pt”>Message发布时间</param>
XML 24        public MessageModel(string msg, DateTime pt)
XML 25XML 26        XML 27{
XML 28            this._message = msg;
XML 29            this._publishTime = pt;
XML 30        }
XML 31
XML 32        private string _message;
XML 33XML 34        /**//// <summary>
XML 35        /// Message内容
XML 36        /// </summary>
XML 37        public string Message
XML 38XML 39        XML 40{
XML 41XML 42            get XML 43{ return _message; }
XML 44XML 45            set XML 46{ _message = value; }
XML 47        }
XML 48
XML 49        private DateTime _publishTime;
XML 50XML 51        /**//// <summary>
XML 52        /// Message发布时间
XML 53        /// </summary>
XML 54        public DateTime PublishTime
XML 55XML 56        XML 57{
XML 58XML 59            get XML 60{ return _publishTime; }
XML 61XML 62            set XML 63{ _publishTime = value; }
XML 64        }
XML 65    }
XML 66}
XML 67

SqlMessage

XML 68using System;
XML 69using System.Collections.Generic;
XML 70using System.Text;
XML 71
XML 72namespace Pattern.Builder
XML 73XML 74XML 75{
XML 76XML 77    /**//// <summary>
XML 78    /// Sql方式操作Message
XML 79    /// </summary>
XML 80    public class SqlMessage
XML 81XML 82    XML 83{
XML 84XML 85        /**//// <summary>
XML 86        /// 获取Message
XML 87        /// </summary>
XML 88        /// <returns></returns>
XML 89        public List<MessageModel> Get()
XML 90XML 91        XML 92{
XML 93            List<MessageModel> l = new List<MessageModel>();
XML 94            l.Add(new MessageModel(“SQL方式取得Message”, DateTime.Now));
XML 95
XML 96            return l;
XML 97        }
XML 98
XML 99XML 100        /**//// <summary>
XML 101        /// 插入Message
XML 102        /// </summary>
XML 103        /// <param name=”mm”>Message实体对象</param>
XML 104        /// <returns></returns>
XML 105        public bool Insert(MessageModel mm)
XML 106XML 107        XML 108{
XML 109            // 代码略
XML 110            return true;
XML 111        }
XML 112    }
XML 113}
XML 114

XmlMessage

XML 115using System;
XML 116using System.Collections.Generic;
XML 117using System.Text;
XML 118
XML 119namespace Pattern.Builder
XML 120XML 121XML 122{
XML 123XML 124    /**//// <summary>
XML 125    /// Xml方式操作Message
XML 126    /// </summary>
XML 127    public class XmlMessage
XML 128XML 129    XML 130{
XML 131XML 132        /**//// <summary>
XML 133        /// 获取Message
XML 134        /// </summary>
XML 135        /// <returns></returns>
XML 136        public List<MessageModel> Get()
XML 137XML 138        XML 139{
XML 140            List<MessageModel> l = new List<MessageModel>();
XML 141            l.Add(new MessageModel(“XML方式取Message”, DateTime.Now));
XML 142
XML 143            return l;
XML 144        }
XML 145
XML 146XML 147        /**//// <summary>
XML 148        /// 插入Message
XML 149        /// </summary>
XML 150        /// <param name=”mm”>Message实体对象</param>
XML 151        /// <returns></returns>
XML 152        public bool Insert(MessageModel mm)
XML 153XML 154        XML 155{
XML 156            // 代码略
XML 157            return true;
XML 158        }
XML 159    }
XML 160}
XML 161

Operation

XML 162using System;
XML 163using System.Collections.Generic;
XML 164using System.Text;
XML 165
XML 166using System.Reflection;
XML 167
XML 168namespace Pattern.Builder
XML 169XML 170XML 171{
XML 172XML 173    /**//// <summary>
XML 174    /// 操作(Product)
XML 175    /// </summary>
XML 176    public class Operation
XML 177XML 178    XML 179{
XML 180        private string _type;
XML 181        private Dictionary<string, string> _dictionary;
XML 182
XML 183XML 184        /**//// <summary>
XML 185        /// 构造函数
XML 186        /// </summary>
XML 187        /// <param name=”type”>产品种类</param>
XML 188        public Operation(string type)
XML 189XML 190        XML 191{
XML 192            _dictionary = new Dictionary<string, string>();
XML 193            this._type = type;
XML 194        }
XML 195
XML 196XML 197        /**//// <summary>
XML 198        /// 索引器
XML 199        /// </summary>
XML 200        /// <param name=”key”></param>
XML 201        /// <returns></returns>
XML 202        public string this[string key]
XML 203XML 204        XML 205{
XML 206XML 207            get XML 208{ return _dictionary[key]; }
XML 209XML 210            set XML 211{ _dictionary[key] = value; }
XML 212        }
XML 213
XML 214XML 215        /**//// <summary>
XML 216        /// 获得结果
XML 217        /// </summary>
XML 218        /// <returns></returns>
XML 219        public string GetResult()
XML 220XML 221        XML 222{
XML 223            Assembly assembly = Assembly.Load(“Pattern.Builder”);
XML 224
XML 225            MethodInfo methodGet = assembly.GetType(“Pattern.Builder.” + _dictionary[“get”].Split(‘|’)[0]).GetMethod(_dictionary[“get”].Split(‘|’)[1]);
XML 226            object objGet = methodGet.Invoke(assembly.CreateInstance(“Pattern.Builder.” + _dictionary[“get”].Split(‘|’)[0]), null);
XML 227            List<MessageModel> m = (List<MessageModel>)objGet;
XML 228            
XML 229            MethodInfo methodInsert = assembly.GetType(“Pattern.Builder.” + _dictionary[“insert”].Split(‘|’)[0]).GetMethod(_dictionary[“insert”].Split(‘|’)[1]);
XML 230XML 231            object objInsert = methodInsert.Invoke(assembly.CreateInstance(“Pattern.Builder.” + _dictionary[“insert”].Split(‘|’)[0]), new object[] XML 232{ new MessageModel(_dictionary[“insert”].Split(‘|’)[2], Convert.ToDateTime(_dictionary[“insert”].Split(‘|’)[3])) });
XML 233            bool b = (bool)objInsert;
XML 234
XML 235            return “类型为” + this._type + “的尽结果:<br />” + b.ToString() + “<br />” + m[0].Message + ” ” + m[0].PublishTime.ToString() + “<br />”;
XML 236        }
XML 237    }
XML 238}
XML 239

AbstractMessageBuilder

XML 240using System;
XML 241using System.Collections.Generic;
XML 242using System.Text;
XML 243
XML 244namespace Pattern.Builder
XML 245XML 246XML 247{
XML 248XML 249    /**//// <summary>
XML 250    /// 抽象Message建造者(Builder)
XML 251    /// </summary>
XML 252    public abstract class AbstractMessageBuilder
XML 253XML 254    XML 255{
XML 256XML 257        /**//// <summary>
XML 258        /// 构造函数
XML 259        /// </summary>
XML 260        /// <param name=”type”>产品品种</param>
XML 261        public AbstractMessageBuilder(string type)
XML 262XML 263        XML 264{
XML 265            this._operation = new Operation(type);
XML 266        }
XML 267
XML 268XML 269        /**//// <summary>
XML 270        /// 操作(Product)
XML 271        /// </summary>
XML 272        protected Operation _operation;
XML 273XML 274        /**//// <summary>
XML 275        /// 操作(Product)
XML 276        /// </summary>
XML 277        public Operation Operation
XML 278XML 279        XML 280{
XML 281XML 282            get XML 283{ return _operation; }
XML 284XML 285            set XML 286{ _operation = value; }
XML 287        }
XML 288
XML 289XML 290        /**//// <summary>
XML 291        /// 建造插入方法
XML 292        /// </summary>
XML 293        /// <param name=”mm”></param>
XML 294        abstract public void BuilderInsert(MessageModel mm);
XML 295
XML 296XML 297        /**//// <summary>
XML 298        /// 建造获取方式
XML 299        /// </summary>
XML 300        abstract public void BuilderGet();
XML 301    }
XML 302}
XML 303

SqlMessageBuilder

XML 304using System;
XML 305using System.Collections.Generic;
XML 306using System.Text;
XML 307
XML 308namespace Pattern.Builder
XML 309XML 310XML 311{
XML 312XML 313    /**//// <summary>
XML 314    /// SqlMessage建造者(ConcreteBuilder)
XML 315    /// </summary>
XML 316    public class SqlMessageBuilder : AbstractMessageBuilder
XML 317XML 318    XML 319{
XML 320XML 321        /**//// <summary>
XML 322        /// 构造函数
XML 323        /// </summary>
XML 324        public SqlMessageBuilder()
XML 325            : base(“sql”)
XML 326XML 327        XML 328{
XML 329 
XML 330        }
XML 331
XML 332XML 333        /**//// <summary>
XML 334        /// 建造Sql插入方法
XML 335        /// </summary>
XML 336        /// <param name=”mm”>Message实体对象</param>
XML 337        public override void BuilderInsert(MessageModel mm)
XML 338XML 339        XML 340{
XML 341            base._operation[“insert”] = “SqlMessage|Insert|” + mm.Message + “|” + mm.PublishTime.ToString() + “”;
XML 342        }
XML 343
XML 344XML 345        /**//// <summary>
XML 346        /// 建造Sql获取方式
XML 347        /// </summary>
XML 348        public override void BuilderGet()
XML 349XML 350        XML 351{
XML 352            base._operation[“get”] = “SqlMessage|Get”;
XML 353        }
XML 354    }
XML 355}
XML 356

XmlMessageBuilder

XML 357using System;
XML 358using System.Collections.Generic;
XML 359using System.Text;
XML 360
XML 361namespace Pattern.Builder
XML 362XML 363XML 364{
XML 365XML 366    /**//// <summary>
XML 367    /// XmlMessage建造者(ConcreteBuilder)
XML 368    /// </summary>
XML 369    public class XmlMessageBuilder : AbstractMessageBuilder
XML 370XML 371    XML 372{
XML 373XML 374        /**//// <summary>
XML 375        /// 构造函数
XML 376        /// </summary>
XML 377        public XmlMessageBuilder()
XML 378            : base(“xml”)
XML 379XML 380        XML 381{
XML 382 
XML 383        }
XML 384
XML 385XML 386        /**//// <summary>
XML 387        /// 建造Xml插入方法
XML 388        /// </summary>
XML 389        /// <param name=”mm”>Message实体对象</param>
XML 390        public override void BuilderInsert(MessageModel mm)
XML 391XML 392        XML 393{
XML 394            base._operation[“insert”] = “XmlMessage|Insert|”+mm.Message+”|”+mm.PublishTime.ToString()+””;
XML 395        }
XML 396
XML 397XML 398        /**//// <summary>
XML 399        /// 建造Xml获取方式
XML 400        /// </summary>
XML 401        public override void BuilderGet()
XML 402XML 403        XML 404{
XML 405            base._operation[“get”] = “XmlMessage|Get”;
XML 406        }
XML 407    }
XML 408}
XML 409

Message

XML 410using System;
XML 411using System.Collections.Generic;
XML 412using System.Text;
XML 413
XML 414namespace Pattern.Builder
XML 415XML 416XML 417{
XML 418XML 419    /**//// <summary>
XML 420    /// 指导者(Director)
XML 421    /// </summary>
XML 422    public class Message
XML 423XML 424    XML 425{
XML 426XML 427        /**//// <summary>
XML 428        /// 调用具体建造者角色以创造产品对象
XML 429        /// </summary>
XML 430        /// <param name=”messageBuilder”>AbstractMessageBuilder</param>
XML 431        /// <param name=”mm”>Message实体对象</param>
XML 432        public void Construct(AbstractMessageBuilder messageBuilder, MessageModel mm)
XML 433XML 434        XML 435{
XML 436            messageBuilder.BuilderInsert(mm);
XML 437            messageBuilder.BuilderGet();
XML 438        }
XML 439    }
XML 440}
XML 441

client

XML 442using System;
XML 443using System.Data;
XML 444using System.Configuration;
XML 445using System.Collections;
XML 446using System.Web;
XML 447using System.Web.Security;
XML 448using System.Web.UI;
XML 449using System.Web.UI.WebControls;
XML 450using System.Web.UI.WebControls.WebParts;
XML 451using System.Web.UI.HtmlControls;
XML 452
XML 453using Pattern.Builder;
XML 454
XML 455public partial class Builder : System.Web.UI.Page
XML 456XML 457XML 458{
XML 459    protected void Page_Load(object sender, EventArgs e)
XML 460XML 461    XML 462{
XML 463        Message m = new Message();
XML 464
XML 465        AbstractMessageBuilder amb = new SqlMessageBuilder();
XML 466        m.Construct(amb, new MessageModel(“插入”, DateTime.Now));
XML 467
XML 468        Response.Write(amb.Operation.GetResult());
XML 469
XML 470        amb = new XmlMessageBuilder();
XML 471        m.Construct(amb, new MessageModel(“插入”, DateTime.Now));
XML 472
XML 473        Response.Write(amb.Operation.GetResult());
XML 474    }
XML 475}
XML 476

运转结果
品类也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

OK
[源码下载]

相关文章

网站地图xml地图