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