享元模式

来源:互联网 发布:淘宝小米f码 编辑:程序博客网 时间:2024/05/22 08:19
    在系统特定场景的系统中,包含大量的重复的实体。如棋类游戏中的棋子,大多形状/大小/都相同;又如游戏中,大量完全相同的小怪物,外观/基础属性等也完全相同。如果每个这种实体都完全对应一个对象,那么内存中将存储大量的重复数据,浪费了资源/降低了资源利用率。
    享元模式就是为了解决这个问题,它将这类重复的、不变的小粒度实体,抽象成元对象,又称为享元。存储在享元池中,然后在需要使用享元的地方拿出来用,实现了复用。类似线程池的思想。这大大的节省了内存,而且对象重复率、重用率越高,效果越明显。例:

    上例中,将字母作为享元,放在享元池中。使用时,再引用。
    每个对象不可能全都具有完全的属性,例如上例中,每次引用时,字母的大小、颜色等都可能不同。享元模式能实现共享的前提是对享元状态的划分:内部状态、外部状态。
    内部状态是享元内部的不会改变、可以共享的状态;
    外部状态是可变的、不可共享的。
    通过将具有相同内部状态的对象放到享元池,实现共享。使用时,再将外部状态注入。

   定义 : 运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。

    享元模式通常配合工厂模式使用,工厂作为享元的创建和管理者。


    Flyweight为抽象享元类,工厂针对抽象享元编程。将各种类型的享元存储在享元池中。

    内部状态作为成员封在享元内部,而外部状态通常通过方法参数的形式传到享元内部,供具体行为使用。

   UnsharedConcreteFlyweoght为不可共享的实现,这也是常存在的。如果不存在,就称为单纯享元模式。

还有一种特殊的情况:复合享元模式


    享元通过组合模式组成一个复合的享元,这个复合享元本身不可共享,但内部可拆为可共享的一个个享元。通过复合享元可以实现每个享元都具有相同的外部状态,如果希望一系列享元具有相同外部状态,可以使用复合享元。


    享元模式可与工厂模式、单例模式、组合模式等一起使用。

    总结:

        优点:

  • 复用对象,减少内存使用
        缺点:

  • 系统变得复杂,逻辑繁琐
  • 需要将实体抽象出内部状态和外部状态
        适用场景:

  • 大量重复对象,造成内存浪费
  • 可变状态可以被外部化,并且不会带来太大的复杂性

1 0
原创粉丝点击