美文网首页
2.1 structure 结构性设计模式-Flyweight享

2.1 structure 结构性设计模式-Flyweight享

作者: entro | 来源:发表于2019-03-27 21:41 被阅读0次

    FlyWeight 享元模式

    [TOC]

    结构性设计模式
    又名轻量级模式

    1. 简介

    • 使用共享技术支持大量细粒度的对象的共享。比如jdk种默认缓存Integer类型值为-127到128的对象。
    • 享元模式可以共享的相同内容称为内部状态Intrinsic State
    • 需要外部环境来设置的不能共享的内容称之为外部状态Extrinsic State
    • 享元模式种通常会出现工厂模式,需要创建一个享元工厂Flyweight Factory来负责维护一个享元池Flyweight Pool

    2. 四种角色:Flyweight,Concrete Flyweight,Unshared Concrete Flyweight,Flyweight Factory

    角色 个数
    Flyweight:抽象享元类 一个
    Concrete Flyweight: 具体享元类 多个
    Unshared Concrete Flyweight:不共享具体享元类 多个
    Flyweight Factory:享元工厂类 一个
    • Flyweight Factory 享元工厂类用来创建并管理Flyweight的子类。
      当用户请求一个Flyweight的时候,Flyweight Factory提供一个已创建的实例(包含共享的Concrete Flyweight 和不共享的 Unshared Concrete Flyweight)或者创建一个(不存在的话)。

    3. 类图

    Flyweight.png

    4. 最佳实践

    1. 在享元模式的享元工厂类中通常提供一个静态的工厂方法用于返回享元对象,使用简单工厂模式来生成享元对象。
    2. 在一个系统中,通常只有唯一一个享元工厂,因此享元工厂类可以使用单例模式进行设计。
    3. 享元模式可以结合组合模式形成复合享元模式,统一对享元对象设置外部状态。

    5. 适用场景和变种

    适用场景

    1. 系统中存在大量相同或相似的对象,这些对象耗费大量的内存资源。
    2. 大部分的对象可以按照内部状态进行分组,且可将不同部分外部化,这样每一个组只需保存一个内部状态。
    3. 由于享元模式需要额外维护一个保存享元的数据结构,所以应当在有足够多的享元实例时才值得使用享元模式。

    变种 特殊的两种享元模式:单纯享元模式 复合享元模式

    • 单纯享元模式
      上面介绍的享元模式包含可共享的内部状态和不可共享的外部状态。
      如果所有状态都可以共享,即只存在内部状态,则为单纯享元模式。
      这种,所有的具体享元类都是可以共享的,不存在非共享的具体享元类的享元模式是单纯享元模式。

    • 复合享元模式
      复合享元模式种有些享元对象是由协议单纯享元对象组合而成的,他们就是复合享元对象。虽然复合享元对象本身不能共享,但是他们可以分解成单纯享元对象而被共享。

    6. 优缺点

    • 享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(External State)。

    优点

    • 极大的减少内存种对象的数量,提升系统性能,节约内存。
    • 享元模式以共享的方式高效地支持大量的细粒度对象。

    缺点

    • 享元模式使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化。
    • 为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。

    7. 应用场景举例 Integer,Long等5种基本类型的包装类的valueOf方法

    • Java中5中Number子类,即boolean,byte,short,int,long,char的包装类的valueOf方法
      Java中8种基本类型:boolean,byte,short,int,long,char,float,double,对应8个包装类,
      其中boolean,byte,short,int,long,char五种基本类型的包装类的 valueof方法中都使用了享元模式
      比如Long类的valueOf方法是这样实现的:
    public static Long valueOf(long l) {
            final int offset = 128;
            if (l >= -128 && l <= 127) { // will cache
                return LongCache.cache[(int)l + offset];
            }
            return new Long(l);
    }
    
    • 自己项目举例:
      //todo

    相关文章

      网友评论

          本文标题:2.1 structure 结构性设计模式-Flyweight享

          本文链接:https://www.haomeiwen.com/subject/qeqxbqtx.html