七个结构模式之享元模式(Flyweight Pattern)

定义:
运用共享技术对大量细粒度对象的复用,这要求这些对象都很相似,状态变化很小。将这些对象的内部状态和外部状态进行区分,对于内部状态相同的只存储一个对象,而对不同的外部状态则采用不同的操作。

结构图:

  • Flyweight:抽象享元类,通常是一个接口或者是抽象类。其中定义了具体享元类的公用方法,包括向外提供内部状态数据展示的方法和设置外部数据状态。
  • ConcreteFlyweight:具体享元类,实现了抽象享元类定义的方法,为内部状态提供了存储空间,并对外部状态作出交互。
  • UnsharedConcrteFlyweight:非共享享元类,并不是所有抽象享元类都会被共享,不能被共享的子类可以设计为非共享具体享元类。
  • FlyweightFactory:享元类工厂,一般都会采用工厂方法来配合享元类。享元工厂用于创建和管理享元对象,它将各种对象存储在一个享元池中,一般采用键值对的方式。

单纯享元模式和复合享元模式

  • 单纯享元模式中,所有具体享元类都是可以共享的。
  • 复合享元模式可以看做是享元模式和组合模式的一个结合,具体实现享元接口的复合享元类含有对抽象享元类的引用。复合享元模式可以用在一些享元类的外部状态都相同,而内部状态不同的情况。这样就不用重复实现具有相同外部状态的享元类,而是将这些享元类封装到一个复合享元类中,复合享元类的外部状态直接调用内部享元类的外部状态。具体结构图如下:

优点:

  • 极大地减少内存中对象的个数,从而节约系统资源,提高系统性能。
  • 享元的外部状态相对独立,而且不会影响到内部状态,从而使得享元可以在不同环境内被共享。

适用场景:

  • 一个系统中含有大量相同或者相似的对象,造成内存的大量耗费。
  • 对象的大部分状态都可以外化,可以将这些外部状态传入对象中。

实例:

Flyweight.java

posted on 2016-11-13 19:11  云破天蓝  阅读(257)  评论(0编辑  收藏  举报

导航