享元模式(flyweight),運用共享技術有效的支援大量細粒度的物件。也就是說當專案中需要應用大量相同或相似的功能**時,那麼對於硬碟、記憶體、cpu、資料庫空間的等伺服器資源均可達到共享,以減少伺服器資源,提高利用率。
享元模式uml類圖:
如上圖所示,flyweight類,它是所有具體享元類的超類或者介面,通過這個介面,flyweight可以接受並作用於外部狀態;concreteflyweight是繼承flyweight超類或者實現flyweight介面,並為內部狀態增加儲存空間;unsharedconcreteflyweight是指那些不需要共享的flyweight子類。因為flyweight介面共享成為可能,但它並不強制共享;flyweightfactory是乙個享元工廠,用來建立並管理flyweight物件,它主要是用來確保合理地共享flyweight,當使用者請求乙個flyweight時,flyweightfactory物件提供乙個已建立的例項或者建立乙個(如果沒有的話)。
享元模式**實現:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.collections;
namespace flyweight
/*concreteflyweight是繼承flyweight超類或者實現flyweight介面,並為內部狀態增加儲存空間。*/
class concreteflyweight : flyweight
}/*unsharedconcreteflyweight是指那些不需要共享的flyweight子類。因為flyweight介面共享成為可能,但它並不強制共享。*/
class unsharedflyweight : flyweight
}/*flyweightfactory是乙個享元工廠,用來建立並管理flyweight物件。它主要是用來確保合理地共享flyweight,當使用者請求乙個
flyweight時,flyweightfactory物件提供乙個已建立的例項或者建立乙個(如果沒有的話)*/
class flyweightfactory
public flyweight getflyweight(string key)}}
客戶端:
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace flyweight}}
享元模式總結:在享元物件內部並且不會隨環境改變而改變的共享部分,可以稱之為是享元物件的內部狀態,而隨環境改變而改變的、不可以共享的狀態就是外部狀態了。事實上,享元模式可以避免大量非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果能發現這些例項除了幾個引數外基本上都是相同的,有時就能夠受大幅度減少需要例項化的類的數量。如果能把那些引數移到類例項的外面,在方法呼叫時將它們傳遞進來,就可以通過共享大幅度地減少單個例項的數目。也就是說,享元模式flyweight執行時所需要的狀態是有內部的也可能有外部的,內部狀態儲存於concreteflyweight物件之中,而外部物件則應該考慮由客戶端物件儲存或計算,當呼叫flyweight物件的操作時,將該狀態傳遞給它。
如果乙個應用程式使用了大量的物件,而大量的這些物件造成了儲存開銷時就應該考慮使用;還有就是物件的大多數狀態可以外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時可以考慮用享元模式。
享元模式應用案例——**共享
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.collections;
namespace flyweightexample
public string name}}
//**抽象類
abstract class website
//具體**類
class concretewebsite : website
public override void use(user user)//實現use方法
}//**工廠類
class websitefactory
//獲得**分類總數
public int getwebsitecount()}}
//客戶端
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace flyweightexample}}
執行結果:
FlyWeight 享元模式
include include include using namespace std class flyweight virtual flyweight m vector.clear class flyweightfactorya public flyweightfactory flyweight...
享元模式 Flyweight
享元模式運用共享技術有效地支援大量細粒度的物件。uml圖如下 c 實現如下 思考 flyweight根據客戶需求返回已經生成好的物件,但一定要事先生成物件例項嗎?答 實際上是不一定需要的,完全可以初始化的時候什麼也不做,到需要的時候,再去判斷物件是否為null來決定是否例項化。思考 為什麼要有uns...
享元模式 flyweight
flyweight是輕量級的意思,中文這邊翻譯成享元,更容易讓人理解一些。享元模式是為了應對大量細粒度物件重複的問題。程式中存在大量細粒度的物件,每次要使用時都必須建立乙個新的物件,既影響了執行效率又增加了記憶體消耗。於是有了享元模式,享元模式提取出這些細粒度物件中間公共的狀態 屬性,我的理解 只生...