定义

Use sharing to support large numbers of fine-grained objects efficiently.(使用共享对象可有效地支持大量的细粒度对象。)享元模式(Flyweight Pattern)是池技术的重要实现方式。

image.png

对象的内部状态和外部状态:

  • 内部状态

内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变,它们可以作为一个对象的动态附加信息,不必直接存储在具体某个对象中,属于可以共享的部分。

  • 外部状态

外部状态是对象得以依赖的一个标记,是随着环境改变而改变、不可共享的状态。是一批对象的唯一标识,是唯一的一个索引值。

享元模式的角色:

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

享元模式的应用

享元模式的优缺点

享元模式是一个非常简单的模式,他可以大大减少应用程序创建的对象,降低程序内存的占用,增强程序的性能,但它同时也提高了系统复杂性,需要分离出外部状态和内部状态,而且外部状态具有固化特性,不应该随内部改变而改变,否则导致系统的逻辑混乱。

享元模式的使用场景

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