享元模式,运用共享技术有效的支持大量细粒度的对象。享元模式结构图如下所示:
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);
}
}
享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本上都是相同的,就能大幅度减少实例化类的数量,如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度减少单个实例的数目。
享元模式分为内部状态和外部状态:
内部状态:在享元状态内部,不随环境改变而改变的共享部分。
外部状态:在享元状态外部,随着环境改变而改变不能共享的部分。
享元模式优缺点:
优点:
- 能够极大的减少系统中对象的个数
- 享元模式使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象在不同环境中被共享
缺点:
- 由于享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上更加复杂化
- 为了使对象可以共享,享元模式需要将对象的状态外部化,读取外部状态使得运行时间变长