11、結構模式之享元(Flyweight)模式

什麼是享元模式

享元模式是對象的結構模式,是運用共享技術來有效的支持大量細粒度的對象。享元對象能作到共享的關鍵是區分內蘊狀態外蘊狀態。一個內蘊狀態是存儲在享元對象內部,而且是不會隨環境改變而有所不一樣的,所以一個享元能夠具備內蘊狀態並能夠共享。一個外蘊狀態是隨環境改變而改變的、不能夠共享的狀態。享元的外蘊狀態必須由客戶端保存,並在享元對象被建立以後,在須要使用的時候再傳入到享元對象內部。外蘊狀態不能夠影響到享元對象的內蘊狀態,換句話說它們是相互獨立的。設計模式

享元模式的結構圖以下(源自大話設計模式)設計

image

Flyweight:是全部享元類的超類或者接口,經過這個接口,Flyweight能夠接受並做用於外部狀態。對象

ConcreteFlyweight:繼承自Flyweight,是內部狀態的具體實現。blog

UnsharedConcreteFlyweight:實現那些不須要共享的狀態,從Flyweight接口派生使得共享成爲可能,可是不強制共享。繼承

FlyweightFactory:享元工廠,用來建立並管理Flyweight對象,他主要是用來確保合理地共享Flyweight,當用戶請求一個Flyweight時,該工廠類會爲其提供一個建立好的對象或者建立一個對象(若是不存在的話)並返回。接口

享元模式的應用

當如下全部條件都知足時,能夠考慮使用享元模式:內存

一、 一個系統有大量的對象。get

二、 這些對象耗費大量的內存。it

三、 這些對象中狀態中的大部分均可之外部化。軟件

四、 這些對象能夠按照內蘊狀態分紅不少組,當把外蘊對象從對象中剔除時,每個組均可以僅用一個對象代替。

五、 軟件系統不依賴於這些對象的身份,換言之,這些對象能夠是不可分辨的。

使用享元模式,能夠經過共享對象,節約存儲的開銷。好比Java中的String對象就是使用了享元模式。

享元模式的優勢和缺點

享元模式的優勢在於它大幅度下降內存中對象的數量。可是作到這一點它付出的代價也是很高的:

一、 享元模式使得系統更加複雜。爲了使對象能夠共享,須要將一些狀態外部化,這使得程序的邏輯複雜化。

二、 享元模式將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長。

相關文章
相關標籤/搜索