享元(Flyweight)設計模式

一、享元模式以共享的方式高效地支持大量的細粒度對象java

二、Java中的String類型就是使用了享元模式設計

  • String對象是final類型,對象一旦建立就不可改變
  • JAVA會確保一個字符串常量在常量池中只有一個拷貝
String a = "abc";
        String b = "abc";
        System.out.println(a==b);//true
  • 這樣的設計避免了在建立N多相同對象時所產生的沒必要要的大量的資源消耗

三、享元模式的結構3d

  • 採用一個共享來避免大量擁有相同內容對象的開銷
  • 享元對象能作到共享的關鍵是區分內蘊狀態(Internal State)外蘊狀態(External State)
  • 一個內蘊狀態是存儲在享元對象內部的,而且是不會隨環境的改變而有所不一樣;一個享元能夠具備內蘊狀態並能夠共享
  • 一個外蘊狀態是隨環境的改變而改變的、不能夠共享的
  • 享元對象的外蘊狀態必須由客戶端保存,並在享元對象被建立以後,在須要使用的時候再傳入到享元對象內部
  • 外蘊狀態不能夠影響享元對象的內蘊狀態,它們是相互獨立的

四、享元模式能夠分紅單純享元模式複合享元模式兩種形式code

單純享元模式  對象

  • 全部的享元對象都是能夠共享的

  • 客戶端調用
public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight fly = factory.factory(new Character('a'));
        fly.operation("First Call");
        
        fly = factory.factory(new Character('b'));
        fly.operation("Second Call");
        
        fly = factory.factory(new Character('a'));
        fly.operation("Third Call");
    }

}
  • 執行結果
  • 申請了三個對象,實際建立的享元對象只有兩個,這就是共享的含義

複合享元模式blog

  • 將一些單純享元使用合成模式加以複合,造成複合享元對象
  • 這樣的複合享元對象自己不能共享,可是它們能夠分解成單純享元對象,然後者則能夠共享

  • 抽象享元角色類

  • 具體享元角色類

  • 複合享元對象是由單純享元對象經過複合而成的

  • 享元工廠角色提供兩種不一樣的方法,一種用於提供單純享元對象,另外一種用於提供複合享元對象

  • 客戶端調取

  • 執行結果

結果說明內存

  • 一個複合享元對象的全部單純享元對象元素的外蘊狀態都是與複合享元對象的外蘊狀態相等的。即外運狀態都等於Composite Call
  • 一個複合享元對象所含有的單純享元對象的內蘊狀態通常是不相等的。即內蘊狀態分別爲b、c、a
  • 複合享元對象是不能共享的。即便用相同的對象compositeState經過工廠分別兩次建立出的對象不是同一個對象
  • 單純享元對象是能夠共享的。即便用相同的對象state經過工廠分別兩次建立出的對象是同一個對象

四、享元模式的優缺點資源

  • 享元模式的優勢在於它大幅度地下降內存中對象的數量
  • 享元模式使得系統更加複雜。爲了使對象能夠共享,須要將一些狀態外部化,這使得程序的邏輯複雜化
  • 享元模式將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長
相關文章
相關標籤/搜索