zoukankan      html  css  js  c++  java
  • 七个结构模式之享元模式(Flyweight Pattern)

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

    结构图:

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

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

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

    优点:

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

    适用场景:

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

    实例:

    Flyweight.java

  • 相关阅读:
    csu 1965
    csu 1947 三分
    Codeforces 336C 0-1背包
    POJ 1743 后缀数组
    POJ 2774 后缀数组
    UVA 12333 大数,字典树
    POJ 2942 圆桌骑士
    POJ 1503 大整数
    POJ 2342 树的最大独立集
    POJ 3088 斯特林
  • 原文地址:https://www.cnblogs.com/zhangfei614/p/6059525.html
Copyright © 2011-2022 走看看