享元模式比喻
每天跟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();
}
}
享元模式總結
一些常用的大量的句子存在手機裏用的時候直接用真是方便!在某些情況下,對象的數量可能會很多,從而導致運行時資源與性能損耗,享元模式可以運用共享技術有效地支持大量細密度的對象。