Java 设计模式系列(十一)享元模式

Java 设计模式系列(十一)享元模式

Flyweight 享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。java

1、享元模式的结构

享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最多见、最直观的就是内存的损耗。享元对象能作到共享的关键是区份内部状态(Internal State)和外部状态(External State)。设计模式

一个内部状态是存储在享元对象内部的,而且是不会随环境的改变而有所不一样。所以,一个享元能够具备内蕴状态并能够共享。缓存

一个外部状态是随环境的改变而改变的、不能够共享的。享元对象的外蕴状态必须由客户端保存,并在享元对象被建立以后,在须要使用的时候再传入到享元对象内部。外蕴状态不能够影响享元对象的内部状态,它们是相互独立的。this

图11-1 享元模式的结构

  • Flyweight:享元接口,经过这个接口 flyweight 能够接受并做用于外部状态。经过这个接口传入外部的状态,在享元对象的方法处理中可能会使用这些外部的数据。spa

  • ConcreteFlyweight:具体的享元实现对象,必须是可共享的,须要封装 flyweight 的内部状态。设计

  • FlyweightFactory:享元工厂,主要用来建立并管理共享的享元对象,并对外提供访问共享享元的接口。code

源代码

(1) Flyweight对象

/***
 * 享元接口,经过这个接口享元能够接受并做用于外部状态
 */
public interface Flyweight {
    /** 示例操做,传入外部状态 */
    public void operation(String extrinsicState);
}

public class ConcreteFlyweight implements Flyweight{
    /** 示例,描述内部状态 */
    private String intrinsicState;

    /** 构造方法,传入享元对象的内部状态的数据 */
    public ConcreteFlyweight(String state){
        this.intrinsicState = state;
    }

    public void operation(String extrinsicState) {
        //具体的功能处理,可能会用到享元内部、外部的状态
    }
}

(2) FlyweightFactoryblog

/**
 * 享元工厂,说白了就是一个缓存
 */
public class FlyweightFactory {
    /** 缓存多个flyweight对象,这里只是示意一下 */
    private Map<String, Flyweight> fsMap = new HashMap<String,Flyweight>();

    /** 获取key对应的享元对象 */
    public Flyweight getFlyweight(String key) {
        //这个方法里面基本的实现步骤以下:
        //1:先从缓存里面查找,是否存在key对应的Flyweight对象
        Flyweight f = fsMap.get(key);

        //2:若是存在,就返回相对应的Flyweight对象
        if(f == null){
            //3:若是不存在
            //3.1:建立一个新的Flyweight对象
            f = new ConcreteFlyweight(key);
            //3.2:把这个新的Flyweight对象添加到缓存里面
            fsMap.put(key, f);
            //3.3:而后返回这个新的Flyweight对象
        }
        return f;
    }
}

2、总结

(1) 享元模式的优缺点

享元模式的优势在于它大幅度地下降内存中对象的数量。可是,它作到这一点所付出的代价也是很高的:接口

  • 享元模式使得系统更加复杂。为了使对象能够共享,须要将一些状态外部化,这使得程序的逻辑复杂化。

  • 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。


天天用心记录一点点。内容也许不重要,但习惯很重要!

相关文章
相关标签/搜索