乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
[索引页][源码下载]

乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

作者:webabcd

介绍
运用共享技术有效地支持大量细粒度的对象。

示例
有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支持这些对象。

MessageModel

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Flyweight
{
    /**//// <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;
        /**//// <summary>
        /// Message内容
        /// </summary>
        public string Message
        {
            get { return _message; }
            set { _message = value; }
        }

        private DateTime _publishTime;
        /**//// <summary>
        /// Message发布时间
        /// </summary>
        public DateTime PublishTime
        {
            get { return _publishTime; }
            set { _publishTime = value; }
        }
    }
}

AbstractMessage

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Flyweight
{
    /**//// <summary>
    /// 操作Message抽象类(Flyweight)
    /// </summary>
    public abstract class AbstractMessage
    {
        /**//// <summary>
        /// 获取Message
        /// </summary>
        /// <returns></returns>
        public abstract List<MessageModel> Get();

        /**//// <summary>
        /// 插入Message
        /// </summary>
        /// <param name="mm">Message实体对象</param>
        /// <returns></returns>
        public abstract bool Insert(MessageModel mm);
    }
}

SqlMessage

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Flyweight
{
    /**//// <summary>
    /// Sql方式操作Message(ConcreteFlyweight)
    /// </summary>
    public class SqlMessage : AbstractMessage
    {
        /**//// <summary>
        /// 获取Message
        /// </summary>
        /// <returns></returns>
        public override List<MessageModel> Get()
        {
            List<MessageModel> l = new List<MessageModel>();
            l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));

            return l;
        }

        /**//// <summary>
        /// 插入Message
        /// </summary>
        /// <param name="mm">Message实体对象</param>
        /// <returns></returns>
        public override bool Insert(MessageModel mm)
        {
            // 代码略
            return true;
        }
    }
}

XmlMessage

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Flyweight
{
    /**//// <summary>
    /// Xml方式操作Message(ConcreteFlyweight)
    /// </summary>
    public class XmlMessage : AbstractMessage
    {
        /**//// <summary>
        /// 获取Message
        /// </summary>
        /// <returns></returns>
        public override List<MessageModel> Get()
        {
            List<MessageModel> l = new List<MessageModel>();
            l.Add(new MessageModel("XML方式获取Message", DateTime.Now));

            return l;
        }

        /**//// <summary>
        /// 插入Message
        /// </summary>
        /// <param name="mm">Message实体对象</param>
        /// <returns></returns>
        public override bool Insert(MessageModel mm)
        {
            // 代码略
            return true;
        }
    }
}

MessageFactory

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Flyweight
{
    /**//// <summary>
    /// Message工厂(FlyweightFactory)
    /// </summary>
    public class MessageFactory
    {
        private Dictionary<string, AbstractMessage> _messageObjects = new Dictionary<string, AbstractMessage>();

        /**//// <summary>
        /// 获取Message对象
        /// </summary>
        /// <param name="key">key</param>
        /// <returns></returns>
        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("<br />");
            Response.Write(messageObject.Get()[0].Message + " " + messageObject.Get()[0].PublishTime.ToString());
            Response.Write("<br />");
        }
    }
}

运行结果
True
SQL方式获取Message 2007-5-17 22:20:38
True
XML方式获取Message 2007-5-17 22:20:38

参考
http://www.dofactory.com/Patterns/PatternFlyweight.aspx

OK
[源码下载]

时间: 2024-09-29 05:41:50

乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)的相关文章

【设计模式】—— 享元模式Flyweight

模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了. 再比如餐馆的桌子,餐具,这些都是享元模式的体现.客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不需要每次新来顾客,就买新的盘子餐具. 应用场景 1 一个系统应用到了大量的对象,而且很多都是重复的. 2 由于大量对象的使用,造成了存储效率上的开销.

.net设计模式实例之享元模式( Flyweight Pattern)

一.享元模式简介(Brief Introduction) 享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象. Use sharing to support large numbers of fine-grained objects efficiently. 享元模式可以避免大量非常相似类的开销.在程序设计中有时需要生成大量细粒度的类 实例来表示数据.如果发现这些实例除了几个参数外基本伤都是相同的,有时就能够受大幅 度第减少需要实例化的类的数量.如果能把这些参数

C#设计模式(12)——享元模式(Flyweight Pattern)

原文:C#设计模式(12)--享元模式(Flyweight Pattern) 一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然而享元模式可以解决这个问题,下面具体看看享元模式是如何去解决这个问题的. 二.享元模式的详细介绍 在前面说了,享元模式可以解决上面的问题了,在介绍享元模式之前,让我们先要分析下如果去解决上面那个问题,上面的问题就

设计模式(十)享元模式Flyweight(结构型)

设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展性或抽象性的问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.比如: 例子1:图形应用中的图元等对象.字处理应用中的字符对象等. 2.解决方案

重温设计模式(一)——享元模式(Flyweight)

一.世间万物皆为对象 从大学校园中拦住一个软件工程专业的学生,问他,什么是面向对象.他会告诉你,世间万物皆是对象. 世界之大,何止万物.上至宇宙星辰,下至细菌病毒.皆为对象. 女孩,吐气如兰,仍留淡淡余香. 男孩,闭眼陶醉,不亦乐乎. 二.对象爆炸 呼吸之间,分子无数. 每个分子皆为一对象,恐万台服务器之矩阵亦无可容. 奈何乎? GOF 曰:享元模式! 三.何为享元模式 Flyweight : 次最轻量级的拳击选手.即粒度最小. 因此,享元模式的目的是采用共享技术解决大量细粒度对象的爆炸问题.

C++设计模式13----Flyweight享元模式

Flyweight享元模式概述 作用:运用共享技术有效地支持大量细粒度的对象. 内部状态intrinsic和外部状态extrinsic: 1)Flyweight模式中,最重要的是将对象分解成intrinsic和extrinsic两部分. 2)内部状态:在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态 3)外部状态:而随环境改变而改变的,取决于应用环境,或是实时数据,这些不可以共享的东西就是外部状态了. 4)内部状态和外部状态之间的区别: 在Flyweight模式应用

乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例 有一个Message实体类,某个对象对它的操作有Send()和Insert()方法,现在用一个中介对象来封装这一系列的对象交互. MessageModel

设计模式:享元模式(Flyweight)

 运用共享技术有效地支持大量细粒度的对象.又名"蝇量模式".  在Java语言中,String类型就是使用了享元模式.String对象是final类型,对象一旦创建就不可改变.在JAVA中字符串常量都是存在常量池中的,Java会确保一个字符串常量在常量池中只有一个拷贝.譬如: String a = "abc"; String b = "abc"; System.out.println(a==b);  输出结果:true.这就说明了a和b量引用都指

学习php设计模式 php实现享元模式(flyweight)_php技巧

一.意图运用共享技术有效的支持大量细粒度的对象 享元模式变化的是对象的存储开销二.享元模式结构图 三.享元模式中主要角色抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口.那些需要外蕴状态的操作可以通过调用商业以参数形式传入具体享元(ConcreteFlyweight)角色:实现Flyweight接口,并为内部状态(如果有的话)拉回存储空间.ConcreteFlyweight对象必须是可共享的.它所存储的状态必须是内部的不共享的具体享元(Unsh