我們在實際項目開發過程中,肯定遇到以下類似的情況:專爲小型公司註冊並顯示的公司信息,提供不同樣式的顯示方式;我們不會爲每個註冊的賬戶的公司都開發出一套量身打造的網站,而且才用共享技術的方式來實現核心技術、其他變化部分採用外部變量的方式傳入進行操作。這就是今天我們要講的享元模式。
什麼是享元模式?運用共享的技術有效地支持大量細粒級的對象。換種說法,就是減少創建對象的數量,減少系統開銷。因爲我們的硬件資源是有限的;
代碼部分:
Flyweight類是超類,是具體享元類的接口;這裏要將外部的狀態傳入並可進行處理;
abstract class Flyweight
{
public abstract void Operation(int extrinsicstate);
}
ConcreteFlyweight類爲具體的享元類;
class ConcreteFlyweight:Flyweight
{
public override void Operation(int extrinsicstate)
{
Console.WriteLine("具體的享元對象:"+extrinsicstate);
}
}
我們一定要預留不享元的情況,方便其他的操作;
class UnshareConcreteFlyweight:Flyweight
{
public override void Operation(int extrinsicstate)
{
Console.WriteLine("不共享具體的享元對象:"+extrinsicstate);
}
}
需要用一個工廠類來管理我們的享元對象;存在則獲取,不存在則創建;這樣做可以減少享元對象的個數,減少存儲的開銷;
class FlyweightFactory
{
private Hashtable flyweights=new Hashtable();
public FlyweightFactory()
{
//初始化享元的對象,我們也可以不用初始化,在獲取數據的時候如果爲null,則自動創建添加
flyweights.Add("x",new ConcreteFlyweight());
flyweights.Add("Y",new ConcreteFlyweight());
flyweights.Add("z",new ConcreteFlyweight());
}
public Flyweight GetFlyweight(string key)
{
//如果我們沒有在初始化享元對象,則不存在 採用添加的方式
/*
if(!flyweights.ContainsKey(key))
{
flyweights.Add(key,new ConcreteFlyweight());
}
*/
return ((Flyweight)flyweights[key]);
}
}
客戶端比較簡單,只是要注意我們這個地方有個外部的狀態。我們在實際上區分不同的顯示方式則根據外部變量來進行的。例如:在註冊並顯示不同公司的信息的時候,我們可以根據我們系統申請的ID(唯一值,就是外部狀態)來傳入顯示公司的信息,並根據ID設定好的樣式格式顯示出來。
//客戶端
static void Main(string[] arg)
{
//代碼外部狀態,這個就是變化部分
int extrinsicstate =100;
FlyweightFactory fly=new FlyweightFactory();
Flyweight fx=fly.GetFlyweight("x");
fx.Operation(extrinsicstate--);
Flyweight fx=fly.GetFlyweight("y");
fx.Operation(extrinsicstate--);
Flyweight fx=fly.GetFlyweight("z");
fx.Operation(extrinsicstate--);
UnshareConcreteFlyweight ux=new UnshareConcreteFlyweight();
ux.Operation(extrinsicstate--);
}