Java 設計模式系列(十一)享元模式
Flyweight 享元模式是對象的結構模式。享元模式以共享的方式高效地支持大量的細粒度對象。java
1、享元模式的結構
享元模式採用一個共享來避免大量擁有相同內容對象的開銷。這種開銷最多見、最直觀的就是內存的損耗。享元對象能作到共享的關鍵是區份內部狀態(Internal State)和外部狀態(External State)。設計模式
一個內部狀態是存儲在享元對象內部的,而且是不會隨環境的改變而有所不一樣。所以,一個享元能夠具備內蘊狀態並能夠共享。緩存
一個外部狀態是隨環境的改變而改變的、不能夠共享的。享元對象的外蘊狀態必須由客戶端保存,並在享元對象被建立以後,在須要使用的時候再傳入到享元對象內部。外蘊狀態不能夠影響享元對象的內部狀態,它們是相互獨立的。this
-
Flyweight
:享元接口,經過這個接口 flyweight 能夠接受並做用於外部狀態。經過這個接口傳入外部的狀態,在享元對象的方法處理中可能會使用這些外部的數據。spa -
ConcreteFlyweight
:具體的享元實現對象,必須是可共享的,須要封裝 flyweight 的內部狀態。設計 -
FlyweightFactory
:享元工廠,主要用來建立並管理共享的享元對象,並對外提供訪問共享享元的接口。code
源代碼
(1) Flyweight對象
/*** * 享元接口,經過這個接口享元能夠接受並做用於外部狀態 */ public interface Flyweight { /** 示例操做,傳入外部狀態 */ public void operation(String extrinsicState); } public class ConcreteFlyweight implements Flyweight{ /** 示例,描述內部狀態 */ private String intrinsicState; /** 構造方法,傳入享元對象的內部狀態的數據 */ public ConcreteFlyweight(String state){ this.intrinsicState = state; } public void operation(String extrinsicState) { //具體的功能處理,可能會用到享元內部、外部的狀態 } }
(2) FlyweightFactoryblog
/** * 享元工廠,說白了就是一個緩存 */ public class FlyweightFactory { /** 緩存多個flyweight對象,這裏只是示意一下 */ private Map<String, Flyweight> fsMap = new HashMap<String,Flyweight>(); /** 獲取key對應的享元對象 */ public Flyweight getFlyweight(String key) { //這個方法裏面基本的實現步驟以下: //1:先從緩存裏面查找,是否存在key對應的Flyweight對象 Flyweight f = fsMap.get(key); //2:若是存在,就返回相對應的Flyweight對象 if(f == null){ //3:若是不存在 //3.1:建立一個新的Flyweight對象 f = new ConcreteFlyweight(key); //3.2:把這個新的Flyweight對象添加到緩存裏面 fsMap.put(key, f); //3.3:而後返回這個新的Flyweight對象 } return f; } }
2、總結
(1) 享元模式的優缺點
享元模式的優勢在於它大幅度地下降內存中對象的數量。可是,它作到這一點所付出的代價也是很高的:接口
-
享元模式使得系統更加複雜。爲了使對象能夠共享,須要將一些狀態外部化,這使得程序的邏輯複雜化。
-
享元模式將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長。
天天用心記錄一點點。內容也許不重要,但習慣很重要!