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

简介: 原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)[索引页][源码下载]乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:webabcd 介绍 运用共享技术有效地支持大量细粒度的对象。
原文: 乐在其中设计模式(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
[源码下载]
目录
相关文章
|
设计模式 存储 缓存
【设计模式】【结构型模式】享元模式(Flyweight)
一、入门 什么是享元模式? 享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用,特别适用于存在大量相似对象的情况。 它的核心思想是将对象的内在状态(不变
410 16
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
288 0
|
设计模式 存储 缓存
「全网最细 + 实战源码案例」设计模式——享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少大量相似对象的内存消耗。通过分离对象的内部状态(可共享、不变)和外部状态(依赖环境、变化),它有效减少了内存使用。适用于存在大量相似对象且需节省内存的场景。模式优点包括节省内存和提高性能,但会增加系统复杂性。实现时需将对象成员变量拆分为内在和外在状态,并通过工厂类管理享元对象。
539 92
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy&lt;T&gt;` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
796 1
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
设计模式 Java
Java设计模式-享元模式(12)
Java设计模式-享元模式(12)
257 1
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
258 3