享元(Flyweight Pattern)模式

       Flyweight在拳擊比賽中指最輕量級,選擇使用「享元模式」的意譯,是由於這樣更能反映模式的用意。

享元模式的用意
       享元模式對象的結構模式。享元模式以共享的方式高效地支持大量的細粒度對象。
       享元對象可以作到共享的關鍵是區份內蘊狀態(Internal State)和外蘊狀態(External State)。
       一個內蘊狀態是存儲在享元對象內部的,而且是不會隨環境改變而有所不一樣,所以一個享元能夠具備內蘊狀態並能夠共享。
      一個外蘊狀態是隨環境的改變而改變的、不可共享的狀態。享元對象的外蘊狀態必須由客戶端保存,並在享元對象被建立以後,在須要使用的時候再傳入到享元對象內部。外蘊狀態不會影響享元對象的內蘊狀態,也就是說它們是相互獨立的。
     
享元模式的種類
        
根據所涉及的享元對象的內部表象,享元模式能夠分紅單純享元模式和複合享元模式兩種形式。

        單純享元模式結構示意圖: 
                              
      複合享元模式結構示意圖: 
                         
       從上面的類圖能夠看出,在複合享元模式中,享元對象構成合成模式。所以複合享元模式其實是單純享元模式與合成模式的組合。

享元模式的應用
       享元模式在編輯器系統中大量使用。一個文本編輯器每每會提供不少種字體,而一般的作法就是將每個字母作成一個享元對象。享元對象的內蘊狀態就是這個字母,而字母在文本中的位置和字母大小、風格等其餘信息則是外蘊狀態。好比字母a可能出如今文本的許多地方,雖然這些字母a的位置和字母風格不一樣,可是全部這些地方使用的都是同一個字母對象。這樣一來,字母對象就能夠在整個系統中共享。
      在java語言中,String類型就是使用了享元模式。String對象是不變的對象,一旦建立出來就不能改變,若是要改變一個字符串的值,只能建立一個新的String對象。在JVM 內部,String類型是共享的,若是一個系統中有兩個String對象所包含的字符串相同,JVM 實際上只會建立一個String對象提供給兩個引用,從而實現了對String的共享。String的intern()方法給出這個字符串在共享池中的惟一實例。

單純享元模式的結構
       
類圖與角色
       在單純的享元模式中,全部的享元對象都是能夠共享的。下圖是一個單純的享元模式的簡單實現,其結構圖以下:
                                                     單純享元模式所涉及的角色以下:      (1)抽象享元角色:此角色是全部的具體享元類的超類,爲這些類規定出須要實現的公共接口。那些須要外蘊狀態的操做能夠經過調用商業方法以參數的形式傳入。      (2)具體享元角色:實現抽象享元角色所規定的接口。若是有內蘊狀態的話,必須負責爲內蘊狀態提供存儲空間。享元對象的內蘊狀態必須與對象所處的周圍環境無關,從而使得享元對象能夠在系統內共享。      (3)享元工廠角色:本角色負責建立和管理享元角色。享元工廠角色必須保證享元對象能夠被系統適當的共享。當一個客戶端對象調用一個享元對象的時候,享元工廠角色會檢查系統中是否已經有一個符合要求的享元對象。若是已經有了,享元工廠角色就應當提供這個已有的享元對象;若是系統中沒有一個適當的享元對象,享元工廠角色應當建立一個合適的享元對象。      (4)客戶端角色:本角色須要維護一個對全部享元對象的引用。須要自行存儲全部享元對象的外蘊狀態。              
相關文章
相關標籤/搜索