享元模式比喻
每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。
享元模式意图
享元模式(Flyweight)用用共享技术有效地支持大量细密度的对象。
享元模式类图
享元模式实现
/// <summary>
/// 所有常用句子的超类或接口,通过这个接口可以接受并作用于外部状态
/// </summary>
abstract class Sentence
{
public abstract void Operation();
}
/// <summary>
/// 继承Sentence超类或实现Sentence接口,并为内部状态增加操作
/// </summary>
class FlyweightSentence : Sentence
{
private string word = "";
public FlyweightSentence(string word)
{
this.word = word;
}
public override void Operation()
{
Console.WriteLine(word);
}
}
/// <summary>
/// 那些不共享的句子,继承Sentence超类为共享成为可能,但是并不强制共享
/// </summary>
class UnsharedSentence : Sentence
{
private string word = "";
public UnsharedSentence(string word)
{
this.word = word;
}
public override void Operation()
{
Console.WriteLine(word);
}
}
/// <summary>
/// 一个享元句子工厂,用来创建并管理句子对象,主要是用来确保合理地共享常用句子。
/// 当用户使用某一个句子时,SentenceManager对象提供一个已经创建的实例,如果不存在则创建一个。
/// </summary>
class SentenceManager
{
private Hashtable sentences = new Hashtable();//享元句子集
public Hashtable Sentences
{
get { return sentences; }
set { sentences = value; }
}
/// <summary>
/// 初始化时先生成三个实例
/// </summary>
public SentenceManager()
{
//遇到过生日时要说一些生日快乐方面的祝福
sentences.Add("生日", new FlyweightSentence("生日快乐……"));
//遇到过情人节时要说一些情人节快乐方面的祝福
sentences.Add("情人节", new FlyweightSentence("情人节快乐……"));
//遇到过元旦时要说一些元旦快乐方面的祝福
sentences.Add("元旦", new FlyweightSentence("元旦快乐……"));
}
/// <summary>
/// 根据客户端请求获得已生成的实例
/// </summary>
public Sentence GetSentence(string key)
{
return (Sentence)Sentences[key];
}
}
/// <summary>
/// 享元模式客户端应用
/// </summary>
class Program
{
static void Main(string[] args)
{
SentenceManager sm = new SentenceManager();
//今天朱利IT博客过生日,发一个祝福短信吧
Sentence fs = sm.GetSentence("生日");
//在前面加上MM的名字
Console.Write("朱利IT博客");
//发送短信
fs.Operation();
//哎呦,她没有我的电话号码,忘记了添加我的署名了
UnsharedSentence us = new UnsharedSentence("我是你的粉丝,……");
us.Operation();
//春节快到了,赶紧收集一条春节的短信
FlyweightSentence newFlyweightSentence = new FlyweightSentence("春节快乐……");
sm.Sentences.Add("春节", newFlyweightSentence);
Console.Read();
}
}
享元模式总结
一些常用的大量的句子存在手机里用的时候直接用真是方便!在某些情况下,对象的数量可能会很多,从而导致运行时资源与性能损耗,享元模式可以运用共享技术有效地支持大量细密度的对象。