享元模式(Flyweight Pattern)

用共享的方式提供大量细粒度的对象,降低系统创建类实例的性能消耗,不是特别常用的一种模式。

flyweight.png

不是特别常见就不写示例demo了,最合适的例子就是在线下五子棋的网站,每个棋子只有颜色、位置不同,如果每个棋子都是一个单独的对象那么对于服务器将产生极大的消耗,这种场景就非常适合享元模式。

享元模式中有3个角色:

  1. 抽象享元类:定义需要实现的接口。
  2. 具体享元类:实现抽象享元角色的接口,并且定义内部状态。
  3. 享元工厂类:负责创建、管理享元角色。如果已经存在一个对应的角色,则返回;否则创建。一般使用哈希表来记录。

其中,享元模式中又为内部和外部两类属性。内部属性是共享的,而外部属性则是可变的。比如声明一个五子棋子的抽象享元类,里面定义的颜色就是内部属性,位置则是外部属性。而白色棋子、黑色棋子分别是具体享元类,通过享元工厂来创建具体的棋子。当需要使用位置信息时,则可以通过参数的方式动态的注入到具体实例中。

使用场景

  1. 当系统中某个对象类型的实例较多时。
  2. 对象实例进行分类后,发现真正有区别的分类很少时。

对比

  1. 组合模式:使用享元模式共享组合模式的叶子结点,提高效率。
  2. 单例模式:一般享元工厂都是单例模式。另外,单例模式是享元模式的一种特例。