享元模式

1:細粒度、粗粒度
在項目中,粗細是相對的,粗粒度相當於抽象方法,只有一個輪廓,而沒有具體的實現;細粒度是實現了某個抽象方法,有具體的操作。(只是結合面向對象開發的一個理解)

2:享元模式(Flyweight):運用共享技術有效的支持大量細粒度的對象。
(之所以說細粒度的,是因爲每個實例都對細節有不同的實現,比如人吃飯,每個人每天都有這個動作,但吃的什麼是不同的)

3:享元模式結構圖
這裏寫圖片描述
Flyweight類:它是所有具體享元類的超類或接口,通過這個接口,Flyweight可以接受並作用於外部狀態。
ConcreteFlyweight是集成Flyweight超類或實現Flyweight接口,並未內部狀態增加存儲空間。
UnsharedConcereteFlyweight是指那些不需要共享的Flyweight子類,因爲Flyweight接口共享成爲可能,但它不強制共享。
FlyweightFactory是一個享元工廠,用來創建並管理Flyweight對象,它主要是用來確保合理的共享Flyweight,用戶請求一個Flyweight時,FlyweightFactory對象提供一個已創建的實例或者創建一個(如果不存在的話,這種方式是保證創建的實例是隻有一個)。

4:內部狀態與外部狀態
在享元對象內部並且不會隨着環境改變而改變的共享部分,成爲享元對象的內部狀態,而隨着環境改變而改變的、不可以共享的狀態就是外部狀態。

享元模式可以避免大量非常類似的開銷,在程序設計中,有時需要生成大量細粒度的類實例來表示數據,如果能發現這些事例除了幾個參數其他基本都是相同的,有時就能夠接受大幅度的減少需要實例化的類的數量。如果能把那些參數移到實例的外面,在方法調用的時候將他們傳遞進來,就可以通過共享大幅度的減少單個實例的數目。

外部狀態具體值得確認由客戶端操作。

5:享元模式實現

//抽象的字符類
public abstract class Charactor{
    //屬性
    protected char letter;
    protected int fontsize;
    //顯示方法
public abstract void display();
//設置字體大小
public abstract void setFontSize(int fontsize);
}
//具體的字符類A
public class CharactorA extends Charactor{
    //構造函數
    public CharactorA(){
        this.letter = 'A';
        this.fontsize = 12;
    }
    //顯示方法
    public void display(){
    try{
        System.out.println(this.letter);
    }catch(Exception err){
    }
}
//設置字體大小
public void setFontSize(int fontsize){
    this.fontsize = fontsize;
}
}
//具體的字符類B
public class CharactorB extends Charactor{
    //構造函數
    public CharactorB(){
        this.letter = 'B';
        this.fontsize = 12;
    }
    //顯示方法
    public void display(){
    try{
        System.out.println(this.letter);
    }catch(Exception err){
    }
}
//設置字體大小
public void setFontSize(int fontsize){
    this.fontsize = fontsize;
}
}
//客戶程序
public class ClinetTest{
public static void main(String[] args){
Charactor a = new CharactorA();
Charactor b = new CharactorB();
//設置字符A的大小
a.setFontSize(12);
        //顯示字符B
        a.display();
//設置字符B的大小
b.setFontSize(14);
        //顯示字符B
b.display();
    }
}

6:享元模式使用場景
(1)如果一個應用程序使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用
(2)對象的大多數狀態可以外部狀態,如果刪除對象的外部狀態,那麼可以用相對較少的共享對象取代很多組對象,此時可以使用。

7:享元模式優缺點:
(1)優點
極大的減少了內存中實例的存在,解決了對象的開銷問題
(2)缺點
享元模式使用外部狀態,使程序的邏輯複雜化

8:享元模式總結
(1)享元模式核心在於享元對象的內部狀態(共有屬性或方法)和享元工廠(確保使用一個實例)。
(2)享元模式可以減少內存的對象實例,但也有其它不足,使用時要根據實際情況決定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章