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