1.6 KiB
1.6 KiB
在对象池中,对象一旦产生,必然有一个唯一的、可访问的状态标志该对象,而且池中的对象声明周期是由池容器决定,而不是由使用者决定的。
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)作为标志,可以大幅提升效率