Files
Hui-s-notebook/203-Java/203.1-Java面试/205.19-网络&操作系统/享元模式.md
2023-09-10 10:50:53 +08:00

1.6 KiB
Raw Blame History

在对象池中,对象一旦产生,必然有一个唯一的、可访问的状态标志该对象,而且池中的对象声明周期是由池容器决定,而不是由使用者决定的。

Use sharing to support large numbers of fine-grained objects efficiently.(使用共享对象可有效地支持大量的细粒度的对象。)

细粒度对象

  • 内部状态

内部状态是对象共享出来的信息,存储在享元对象内部且不会随环境改变而改变

  • 外部状态

外部状态是对象得以依赖的一个标记,是随环境改变而改变的,不可用共享的状态,如一批对象的统一标识

  • Flyweight 抽象享元角色
  • ConcreteFlyweight 具体享元角色
  • UnsharedConcreteFlyweighy 不可共享的享元角色
  • FlyweightFactory 享元工厂

在程序开发中,确认只需要一次赋值的属性则设置为 final 类型,避免无意修改导致逻辑混乱,特别是 Session 级的常量或变量

优缺点

大大减少应用程序创建的对象,降低程序内存的占用,同时提高了系统复杂度

使用场景

  • 系统中存在大量的相似对象
  • 细粒度的对象都具备较接近的外部状态,且内部状态与环境无关,也就是说对象没有特定身份
  • 需要缓冲池的场景

线程安全的问题

性能平衡

如果把一个对象作为 Map 类的键值,一定要确保重写了 equals 和 hashCode 方法,否则会出现通过键值搜索失败的情况,例如 map.get(object)、map.contains(object)等会返回失败的结果

外部状态最好以 Java 的基本类型String、int作为标志可以大幅提升效率