Java設計模式 之 享元模式

Java設計模式 之 享元模式

假設現在我們需要根據不同手機電路板進行構造手機,我們新建電路板類,代碼如下:

手機電路板類:

public class PhoneBoard{

    private String name;
    private int count = 0;

    public void setName(String name) {
        this.name = name;
    }

    public void build() {
        count++;
        System.out.println(name + " board build phone - " + count);
    }
}
public class PhoneDemo {

    public static void main(String[] args) {

        // 假設構造3種電路板來製造手機
        for (int i = 0; i < 50; i++) {
            String type = getRandomType();
            PhoneBoard board = new PhoneBoard();
            board.setName(type);
            board.build();
        }

    }

    public static String getRandomType() {
        int random = (int) (Math.random() * 10);
        String type = "Xiaomi";
        if (random < 3) {
            type = "iPhone";
        }else if(random < 6) {
            type = "Huawei";
        }
        return type;
    }

}
// Huawei board build phone - 1
// Huawei board build phone - 1
// iPhone board build phone - 1
// Huawei board build phone - 1
// Huawei board build phone - 1
// Xiaomi board build phone - 1
// Xiaomi board build phone - 1
// ...

上述代碼雖然可以完成我們的任務,但我們發現相同的電路板只被使用了一次就不在使用了,造成了資源浪費,那我們怎麼樣才重複利用這些對象呢?

享元模式實現

這時候我們用享元模式來實現我們的功能,我們利用HashMap將他們存儲起來,代碼如下:

// 可以不單獨使用一個類來實現,這裏爲了直觀

public class PhoneFactory {

    private static HashMap<String, PhoneBoard> mPhones = new HashMap<>();

    public static PhoneBoard createPhone(String type) {
        PhoneBoard board = mPhones.get(type);
        if(board == null) {
            board = new PhoneBoard();
            board.setName(type);
            mPhones.put(type, board);
        }   
        return board;
    }
}

再次請求50次:

public class PhoneDemo {

    public static void main(String[] args) {

        for (int i = 0; i < 50; i++) {
            String type = getRandomType();
            PhoneBoard board = PhoneFactory.createPhone(type);
            board.build();
        }
    }

    public static String getRandomType() {
        int random = (int) (Math.random() * 10);
        String type = "Xiaomi";
        if (random < 3) {
            type = "iPhone";
        }else if(random < 6) {
            type = "Huawei";
        }
        return type;
    }

}

// iPhone board build phone - 1
// Huawei board build phone - 1
// iPhone board build phone - 2
// Xiaomi board build phone - 1
// Huawei board build phone - 2
// Xiaomi board build phone - 2
// Huawei board build phone - 3
// iPhone board build phone - 3
// iPhone board build phone - 4
// iPhone board build phone - 5
// Huawei board build phone - 4
// Xiaomi board build phone - 3
// Huawei board build phone - 5
// Huawei board build phone - 6
// Xiaomi board build phone - 4
// Huawei board build phone - 7
// ...

我們發現電路板對象被利用了起來,這就是享元模式 ,相對是比較容易的,最後我們來總結下 享元模式。

享元模式

目的:運用共享技術有效地支持大量細粒度的對象。
主要解決:
在有大量對象時,有可能會造成內存溢出,我們把其中共同的部分抽象出來,如果有相同的業務請求,直接返回在內存中已有的對象,避免重新創建。
何時使用:
1、系統中有大量對象。
2、這些對象消耗大量內存。
3、這些對象的狀態大部分可以外部化。
4、這些對象可以按照內蘊狀態分爲很多組,當把外蘊對象從對象中剔除出來時,每一組對象都可以用一個對象來代替。
5、系統不依賴於這些對象身份,這些對象是不可分辨的。
如何解決:用唯一標識碼判斷,如果在內存中有,則返回這個唯一標識碼所標識的對象。
關鍵代碼: 用 HashMap 存儲這些對象

其他模式可點擊鏈接進目錄閱讀了解:http://blog.csdn.net/xiao_wanzi94/article/details/78118092

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