享元模式(Flyweight Pattern)
介绍运用共享技术有效地支持大量细粒度的对象。 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支持这些对象。MessageModel
using System;using System.Collections.Generic;using System.Text;namespace Pattern.Flyweight{ ////// 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; } } }}
AbstractMessage
using System;using System.Collections.Generic;using System.Text;namespace Pattern.Flyweight{ ////// 操作Message抽象类(Flyweight) /// public abstract class AbstractMessage { ////// 获取Message /// ///public abstract List Get(); /// /// 插入Message /// /// Message实体对象 ///public abstract bool Insert(MessageModel mm); }}
SqlMessage
using System;using System.Collections.Generic;using System.Text;namespace Pattern.Flyweight{ ////// Sql方式操作Message(ConcreteFlyweight) /// public class SqlMessage : AbstractMessage { ////// 获取Message /// ///public override List Get() { List l = new List (); l.Add(new MessageModel("SQL方式获取Message", DateTime.Now)); return l; } /// /// 插入Message /// /// Message实体对象 ///public override bool Insert(MessageModel mm) { // 代码略 return true; } }}
XmlMessage
using System;using System.Collections.Generic;using System.Text;namespace Pattern.Flyweight{ ////// Xml方式操作Message(ConcreteFlyweight) /// public class XmlMessage : AbstractMessage { ////// 获取Message /// ///public override List Get() { List l = new List (); l.Add(new MessageModel("XML方式获取Message", DateTime.Now)); return l; } /// /// 插入Message /// /// Message实体对象 ///public override bool Insert(MessageModel mm) { // 代码略 return true; } }}
MessageFactory
using System;using System.Collections.Generic;using System.Text;namespace Pattern.Flyweight{ ////// Message工厂(FlyweightFactory) /// public class MessageFactory { private Dictionary_messageObjects = new Dictionary (); /// /// 获取Message对象 /// /// key ///public AbstractMessage GetMessageObject(string key) { AbstractMessage messageObject = null; if (_messageObjects.ContainsKey(key)) { messageObject = _messageObjects[key]; } else { switch (key) { case "xml": messageObject = new SqlMessage(); break; case "sql": messageObject = new XmlMessage(); break; } _messageObjects.Add(key, messageObject); } return messageObject; } }}
Test
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.Flyweight;public partial class Flyweight : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { string[] ary = new string[] { "xml", "sql" }; MessageFactory messageFactory = new MessageFactory(); foreach (string key in ary) { AbstractMessage messageObject = messageFactory.GetMessageObject(key); Response.Write(messageObject.Insert(new MessageModel("插入", DateTime.Now))); Response.Write(""); Response.Write(messageObject.Get()[0].Message + " " + messageObject.Get()[0].PublishTime.ToString()); Response.Write(""); } }}
运行结果
True SQL方式获取Message 2007-5-17 22:20:38 True XML方式获取Message 2007-5-17 22:20:38