享元模式,运用共享技术有效的支持大量细粒度的对象。享元模式结构图如下所示: flyweight Flyweight类,它是所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态。

abstract class Flyweight{
    public abstract void Operation(int extrinsicstate);
}

ConcreteFlyweight是继承Flyweight超类或实现Flyweight接口,并未内部状态增加存储空间。

class ConcreteFlyweight extends Flyweight{
    public void Operation(int extrinsicstate){
        System.out.println("具体Flyweight "+extrinsicstate);
    }
}

UnsharedConcreteFlyweight是指那些不需要共享的Flyweight子类,因为Flyweight接口共享成为可能,但它不强制共享。

class UnsharedConcreteFlyweight extends Flyweight{
    public void Operation(int extrinsicstate){
        System.out.println("不共享具体Flyweight"+extrinsicstate);
    }
}

FlyweightFactory,是一个享元工厂,用来创建并管理Flyweight对象,它主要是用来确保合理的共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个。

class FlyweightFactory{
    private HashMap<String,ConcreteFlyweight> flyweight=new HashMap<String,ConcreteFlyweight>();
    public FlyweightFactory(){
        flyweight.put("X",new ConcreteFlyweight());
    }
    public Flyweight GetFlyweight(String key){
        return flyweight.get(key);
    }
}

享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本上都是相同的,就能大幅度减少实例化类的数量,如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度减少单个实例的数目。

享元模式分为内部状态和外部状态:
内部状态:在享元状态内部,不随环境改变而改变的共享部分。
外部状态:在享元状态外部,随着环境改变而改变不能共享的部分。

享元模式优缺点:
优点:

  • 能够极大的减少系统中对象的个数
  • 享元模式使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象在不同环境中被共享

缺点:

  • 由于享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上更加复杂化
  • 为了使对象可以共享,享元模式需要将对象的状态外部化,读取外部状态使得运行时间变长