享元模式(Flyweight Pattern)
半塘 2024/3/28 Java进阶
共享技术有效地支持大量细粒度的对象。本质就是相同对象属性缓存起来。
- 对象共享就是享元对象
- 相同内部属性状态用同一个,也就是享元对象共享内部状态属性
- 不同属性用外部状态属性,外面传进来
- 本质就是缓存。
# 1、享元模式案例
手机打紧急电话,但每个人拨打的紧急方式不一定相同(110、120),号码是共享的,拨打过就可以缓存起来,后面的人打就不用再生成了,而拨打的原因就各不相同,就可以用外部属性。
public interface Phone {
void call(String msg);
}
public class UsePhone implements Phone{
// 内部属性
private String phoneNumber;
public UsePhone(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
// msg为外部属性
@Override
public void call(String msg) {
System.out.println("hashCode==>"+System.identityHashCode(this)
+":phoneNumber==>"+phoneNumber+":msg==>"+msg);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class UsePhoneFactory {
private Map<String,Phone> map = new HashMap<>();
Phone getPhone(String phoneNumber) {
if (!map.containsKey(phoneNumber)) {
Phone phone = new UsePhone(phoneNumber);
map.put(phoneNumber, phone);
}
return map.get(phoneNumber);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
public class ClientTest {
public static void main(String[] args) {
UsePhoneFactory factory = new UsePhoneFactory();
Phone phone = factory.getPhone("110");
Phone phone2 = factory.getPhone("110");
phone.call("有人抢劫");
phone2.call("有人诈骗");
Phone phone3 = factory.getPhone("119");
Phone phone4 = factory.getPhone("119");
phone3.call("发生火灾");
phone4.call("群众遇险");
}
}
/**
* 输出结果:
* hashCode==>344560770:phoneNumber==>110:msg==>有人抢劫
* hashCode==>344560770:phoneNumber==>110:msg==>有人诈骗
* hashCode==>559450121:phoneNumber==>119:msg==>发生火灾
* hashCode==>559450121:phoneNumber==>119:msg==>群众遇险
* /
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22