博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二十四种设计模式:享元模式(Flyweight Pattern)
阅读量:7282 次
发布时间:2019-06-30

本文共 4914 字,大约阅读时间需要 16 分钟。

享元模式(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

转载于:https://www.cnblogs.com/taotaodetuer/p/6182903.html

你可能感兴趣的文章
并发——读写锁初探
查看>>
前端每日实战:71# 视频演示如何用纯 CSS 创作一个跳 8 字型舞的 loader
查看>>
一点感悟:《Node.js学习笔记》star数突破1000+
查看>>
用Go实现Redis之一准备工作
查看>>
简单5步,从0开始搭建你的第一款小程序
查看>>
安装Scrapy库报错 “error: Microsoft Visual C++ 14.0 is required. ”解决方法
查看>>
根据JWT的key和URL决定是否缓存HTTP请求
查看>>
前端AES加密
查看>>
持续更新 mongoose 细节收集
查看>>
Mybatis常见面试题
查看>>
基于VUE构建做题H5组件【附源代码】
查看>>
BFC深入理解
查看>>
Webpack 将代码打包成什么样子?
查看>>
从头实现一个简易版React(三)
查看>>
SVG相关学习(一)SVG基础
查看>>
极致Web性能 —— SPA性能指南
查看>>
关于 webpack 4.0.0 使用 html-webpack-plugin 报错的处理方法
查看>>
PHP-生成二维码(qr-code)
查看>>
git/github使用(入门到中阶)
查看>>
计数排序,桶排序与基数排序
查看>>