設計模式之享元模式

2021-06-22 16:30:53 字數 2347 閱讀 8240

1、享元模式運用共享技術有效地支援大量細粒度的物件。

uml圖如下:

2、思考:flyweight根據客戶需求返回已經生成好的物件,但一定要事先生成物件例項嗎?

答:實際上是不一定需要的,完全可以初始化的時候什麼也不做,到需要的時候,再去判斷物件是否為null來決定是否例項化。

3、思考:為什麼要有unsharedconcreteflyweight的存在呢?

答:因為儘管我們大部分時間都需要共享物件來降低記憶體的消耗,但個別時候也有可能不需要共享的,那麼此時的unsharedconcreteflyweight子類就有存在的必要了,它可以解決那些不需要共享物件的問題。

4、內部狀態和外部狀態

在享元物件內部並且不會隨環境改變而改變的共享部分,可以稱為是享元物件的內部狀態;而隨著環境變化而變化的不可共享的狀態就是說外部狀態了。

事實上,享元模式可以避免大量非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果能發現這些例項除了幾個引數外基本上都是相同的,有時就能夠大幅度地減小需要例項化的類的數量。如果能把那些引數移到類例項的外面,在方法呼叫時將它們傳遞過來,就可以通過共享大幅度地減少單個例項的數目。

也就是說,享元模式flyweight執行時所需的狀態是有內部的也有可能有外部狀態的,內部狀態儲存在concreteflyweight中,而物件的外部狀態考慮有客戶端物件儲存或計算,當呼叫flyweight物件的操作時,將該狀態傳遞給它。

5、享元模式的應用:

什麼時候使用享元模式?

答:如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時就應該考慮使用;還有就是物件的大多數狀態可以是外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時可以考慮使用享元模式。

6、c++**實現:

[cpp]view plain

copy

#include 

#include 

using

namespace

std;  

/*flyweight類,它是所有具體享元類的

超類或介面,通過這個介面,flyweight

可以接受並作用於外部狀態

*/class

flyweight  

;  /*

concreteflyweight是繼承了flyweight超類或實現

flyweight介面,並為內部狀態增加儲存空間

*/class

concreteflyweight : 

public

flyweight  

};  

/*unsharedconcreteflyweight是指那些不需要共享的

flyweight子類。因為flyweight介面共享成為可能

但它不強制共享

*/class

unsharedconcreteflyweight : 

public

flyweight  

void

operation(

intextrinsicstate)   

};  

/*node 節點

*/struct

node   

;  /*

自己寫的偽map

*/class

mymap  

;  node * mymap::getnode()   

mymap::mymap()   

void

mymap::insert(

char

* str, flyweight * pflyweight)   

pcur = pcur->next[index];  

}  pcur->pflyweight = pflyweight;  

strcpy(pcur->pflyweight->name, str);  

}  flyweight * mymap::query(char

* str)   

pcur = pcur->next[index];  

}  return

pcur->pflyweight;  

}  /*

flyweightfactory是乙個享元工廠,用來建立並

管理flyweight物件,它主要是用來確保合理地

共享flyweight物件提供乙個已建立的例項或者

建立乙個(如果不存在)

*/class

flyweightfactory  

flyweight * getflyweight(char

* str)   

};  

intmain()    

設計模式之 享元模式

享元模式英文稱為 flyweight pattern 又譯為羽量級模式或者蠅量級模式。享元模式的定義為 採用乙個共享類來避免大量擁有相同內容的 小類 的開銷。這種開銷中最常見 直觀的影響就是增加了記憶體的損耗。享元模式以共享的方式高效的支援大量的細粒度物件,減少其帶來的開銷。在名字和定義中都體現出了...

設計模式之享元模式

享元模式運用共享技術有效地支援大量細粒度的物件。如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時應該考慮使用。物件的大多數狀態可以是外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時也可以考慮用享元模式。享元模式uml圖如下 如下 使用者 cl...

設計模式之享元模式

場景 記憶體屬於稀缺資源,不要隨便浪費。如果有很多個完全相同或相似的物件,我們可以通過享元模式,節省記憶體 核心 享元物件能夠做到共享的關鍵是區分了內部狀態和外部狀態 內部狀態 可以共享,不會隨環境變化而改變 外部狀態 不可以共享,會隨環境的變化而改變 簡單享元結構 復合享元模式的結構 統比一下單純...