設計模式,這個東西一直都有耳聞,也曾經研究過一段時間,不過早已經忘記了,現在打算重新撿回來,是以在這裡放出我再次學習的心得體會。
Flyweight,俗稱 享元模式,曾經我好像在那本書上,翻譯成飛行模式,我狂汗,當是我對設計模式還處于剛知曉階段,為此害我對設計模式的一直懷有敬畏之心,破書真是誤認子弟啊。
廢話不多說,先說說我對飛行模式的了解,相信大家看過GOF之後或者自己查閱資料後對其不一定能說出他的精髓所在,在我看來,隻不過是一種節約記憶體的方式,換句話講就是
<b>對于同一個對象保證在記憶體中隻存儲一次,即,不要出現重複存儲同一個對象的程式設計方式</b>
這是我自己的見解,比較權威的說法就是:
<b>運用共享技術有效地支援大量細粒度的對象</b>
适用場合:
F l y w e i g h t模式的有效性很大程度上取決于如何使用它以及在何處使用它。當以下情況都成立時使用F l y w e i g h t模式:
• 一個應用程式使用了大量的對象。
• 完全由于使用大量的對象,造成很大的存儲開銷。
• 對象的大多數狀态都可變為外部狀态。
• 如果删除對象的外部狀态,那麼可以用相對較少的共享對象取代很多組對象。
• 應用程式不依賴于對象辨別。由于F l y w e i g h t對象可以被共享,對于概念上明顯有别的對
象,辨別測試将傳回真值。
<b>通俗的講,如果在一個場合需要多個重複的對象的時候,即可以使用享元模式以節約資源,提高程式運作效率。典型的例子就是線程池,和資料庫的連接配接池。</b>
<b></b>
<b>下面我将我的代碼放出:</b>
using System;
using System.Collections;
namespace GOF.Flyweight
{
public abstract class Flyweight
{
protected string name;
}
public class ConcreteFlyweight : Flyweight
public ConcreteFlyweight(string name)
{
this.name = name;
}
public override string ToString()
return this.name;
public class FlyweightFactory
Hashtable ht = new Hashtable();
public FlyweightFactory()
public Flyweight getFlyWeight(string name)
Flyweight an = ht[name] as Flyweight;
if(an==null)
{
an = new ConcreteFlyweight(name);
ht.Add(name, an);
}
return an;
public void GetSize()
Console.WriteLine("FlyweightFactory's Size is " + ht.Count);
class Program
static void Main(string[] args)
FlyweightFactory factory = new FlyweightFactory();
Flyweight fly1 = factory.getFlyWeight("Google");
Flyweight fly2 = factory.getFlyWeight("Baidu");
Flyweight fly3 = factory.getFlyWeight("Google");
Flyweight fly4 = factory.getFlyWeight("Baidu");
Flyweight fly5 = factory.getFlyWeight("Google");
Flyweight fly6 = factory.getFlyWeight("Google");
Console.WriteLine(fly1.ToString());
Console.WriteLine(fly2.ToString());
Console.WriteLine(fly3.ToString());
Console.WriteLine(fly4.ToString());
Console.WriteLine(fly5.ToString());
Console.WriteLine(fly6.ToString());
factory.GetSize();
}
輸出結果為:
Baidu
FlyweightFactory's Size is 2
請按任意鍵繼續. . .
在這段代碼中最重要的一點是FlyWeightFactory中隊hashtable的應用,通過hashtable來確定目前對象傳回的是同一對象~,hashtable中有就傳回,沒有就新生成,并将其存入hashtable,這個是享元模式的代碼的關鍵點所在,其實,這個才是他的精髓,至于,具體應用中,我覺得不一定非得按照我寫的代碼來,靈活運用,隻要是確定自己的對象在記憶體中是唯一的即可~~