java學習之享元模式

享元模式:flyweight:

 

    有很多個小的對象,它們有很多屬性相同,把它們變成一個對象,那些不同的屬性變成方法的參數,稱之爲外部狀態,那些相同的屬性稱之爲內部狀態

 

一:享元模式的用意 
享元模式以共享的方法高效地支持大量的細粒度對象,享元對象能做到共享的關鍵是區分內蘊狀態和外蘊狀態。 
一個內蘊狀態是存儲在享元對象內部的,並且是不會隨環境改變而有所不同的,因此一個享元可以具有內蘊狀態並可以共享。一個外蘊狀態是隨環境的改變 而改變的,不可以共享的狀態,享元對象的外蘊狀態必須由客戶端保存,並在享元對象被創建之後,在需要使用的時候各方面傳入到享元對象內部,外蘊狀態不可以 影響享元對象的內蘊狀態,換句話說,它們是相互獨立的. 

二:享元模式的應用 
享元模式在編輯器系統中大量使用,一個文本編輯器往往會提供很多種字體,而通常的做法就是將每一個字母做成一個享元對象。享元對象的內蘊狀態就是 這個字母,而字母在文本中的位置和字體風等其他信息則是外蘊狀態,比如字母a可能出現在文本的很多地方,雖然這些字母a的位置和字體風格不同,但是所有這 些地方使用的都是同個字母對象,這樣一來,字母對象就可以在整個系統中共享 
在Java語言中,String類型就使用了享元模式.String對象是不變對象,一旦創建出來就不能改變,如果需要改變一個字符串的值,就只 好創建一個新的String對象,在JVM內部, String對象都是共享的。如果一個系統中有兩個String對象所包含的字符串相同的話,JVM實際上只創建一個String對象提供給兩個引用,從 而實現String對象的共享,String的inern()方法給出這個字符串在共享池中的唯一實例. 

 

三:享元模式應當在什麼情況下使用 
(1)一個系統有大量的對象 
(2)這些對象耗費大量的內存 
(3)這些對象可以按照內蘊狀態分成很多的組,當把外蘊對象從對象中刪除時,每一個組都可以僅用一個對象代替 
(4)使用享元模式需要維護一個記錄了系統已有的所有享元的表,而這需要耗費資源,因此應當在有足夠多的享元實現可供共享時才值的使用享元模式. 

四:享元模式的優點和缺點 
享元模式的優點在於它大幅度地降低內存中的對象的數量,但是也爲這一點付出了代價: 
(1)爲了使對象可以共享,需要將一些狀態外部化,這使得程序的邏輯複雜化 
(2)享元模式將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長.

發佈了28 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章