享元模式(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
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
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