開發多用戶註冊使用的網站---享元模式

        我們在實際項目開發過程中,肯定遇到以下類似的情況:專爲小型公司註冊並顯示的公司信息,提供不同樣式的顯示方式;我們不會爲每個註冊的賬戶的公司都開發出一套量身打造的網站,而且才用共享技術的方式來實現核心技術、其他變化部分採用外部變量的方式傳入進行操作。這就是今天我們要講的享元模式。

      什麼是享元模式?運用共享的技術有效地支持大量細粒級的對象。換種說法,就是減少創建對象的數量,減少系統開銷。因爲我們的硬件資源是有限的;


代碼部分:

 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--);
	
}


      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章