Java 設計模式系列(十一)享元模式

Java 設計模式系列(十一)享元模式

Flyweight 享元模式是對象的結構模式。享元模式以共享的方式高效地支持大量的細粒度對象。java

1、享元模式的結構

享元模式採用一個共享來避免大量擁有相同內容對象的開銷。這種開銷最多見、最直觀的就是內存的損耗。享元對象能作到共享的關鍵是區份內部狀態(Internal State)和外部狀態(External State)。設計模式

一個內部狀態是存儲在享元對象內部的,而且是不會隨環境的改變而有所不一樣。所以,一個享元能夠具備內蘊狀態並能夠共享。緩存

一個外部狀態是隨環境的改變而改變的、不能夠共享的。享元對象的外蘊狀態必須由客戶端保存,並在享元對象被建立以後,在須要使用的時候再傳入到享元對象內部。外蘊狀態不能夠影響享元對象的內部狀態,它們是相互獨立的。this

圖11-1 享元模式的結構

  • 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) 享元模式的優缺點

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

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

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


天天用心記錄一點點。內容也許不重要,但習慣很重要!

相關文章
相關標籤/搜索