1.享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。享元模式运用共享技术实现相同或相似对象的复用。
2.享元模式要求细粒度对象和对象复用,那很多对象具有相同或者相似的特征等等,我们将这些对象的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic)。
● 内部状态
内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变,它们可以作为一个对象的动态附加信息,不必直接储存在具体某个对象中,属于可以共享的部分。
● 外部状态
外部状态是对象得以依赖的一个标记,是随环境改变而改变的、不可以共享的状态,它是一批对象的统一标识,是唯一的一个索引值
3.类型:对象结构型模式
4.类图
5.各部分说明
Flyweight:抽象享元类
声明了具体享元类公共的方法。
提供享元对象的内部数据、设置外部数据。
ConcreteFlyweight:具体享元类
继承或实现了抽象享元类。
其实例称为享元对象。
UnsharedConcreteFlyweight:非共享具体享元类
继承或实现了抽象享元类。
并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类。
FlyweightFactory:享元工厂类
享元工厂类用于创建并管理享元对象。
针对抽象享元类编程,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合(也可以是其他类型的集合。当用户请求一个具体享元对象时,享元工厂提供一个存储在享元池中已创建的实例或者创建一个新的实例(如果不存在的话),返回新创建的实例并将其存储在享元池中。简单来讲,就是构造一个池容器,同时提供从池中获得对象的方法。
5.实现
package 享元模式;
import java.util.HashMap;
public class FlyweightPattern {
public static void main(String[] args) {
Flyweight fw = FlyweightFactory.getFlyweight("1");
System.out.println(fw.toString());
Flyweight fw2 = FlyweightFactory.getFlyweight("2515");
System.out.println(fw2.toString());
fw.operate();
}
}
//抽象享元类
abstract class Flyweight{
//内部状态
private String intrinsic;
//外部状态
protected final String Extrinsic;
//享元角色必须接受外部状态
protected Flyweight(String Extrinsic) {
this.Extrinsic = Extrinsic;
}
//业务操作
public abstract void operate();
//内部状态的getter/setter
public String getIntrinsic(){
return intrinsic;
}
public void setIntrinsic(String intrinsic){
this.intrinsic = intrinsic;
}
}
//具体享元类
class ConcreteFlyweight extends Flyweight{
//接受外部状态
public ConcreteFlyweight(String extrinsic){
super(extrinsic);
}
@Override
public void operate() {
System.out.println("ConcreteFlyweight.operate()");
}
}
//享元工厂类
class FlyweightFactory{
//定义一个池容器
private static HashMap pool = new HashMap();
//享元工厂
public static Flyweight getFlyweight(String Extrinsic){
//需要返回的对象
Flyweight flyweight = null;
//在池中查找
if (pool.containsKey(Extrinsic)){
//有,直接取出
flyweight =(Flyweight)pool.get(Extrinsic);
}else{
//根据外部状态创建享元对象并放入到池中
flyweight = new ConcreteFlyweight(Extrinsic);
pool.put(Extrinsic,flyweight);
}
return flyweight;
}
}
6.优点
享元模式可以实现对象的多次复用,在相同或相似对象较多的特殊情况下可以有效地减少内存中对象的数量。