享元模式(FlyWeight)

2021-09-01 15:33:13 字數 2753 閱讀 9213

享元模式(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是輕量級的意思,中文這邊翻譯成享元,更容易讓人理解一些。享元模式是為了應對大量細粒度物件重複的問題。程式中存在大量細粒度的物件,每次要使用時都必須建立乙個新的物件,既影響了執行效率又增加了記憶體消耗。於是有了享元模式,享元模式提取出這些細粒度物件中間公共的狀態 屬性,我的理解 只生...