享元模式:当系统中存在大量相同或者相似的对象时,通过共享技术实现相同或相似的细粒度对象的复用,从而节约了内存空间,提高了系统性能。在享元模式中提供了一个享元池用于储存已经创建好的享元对象,并通过享元工厂类将享元对象提供给客户端使用。
享元模式的定义:运用共享技术有效地支持大量细粒度对象的复用。
享元模式的结构和实现:
1.Flyweight(抽象享元类):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类的公共方法,这些方法可以向外界提供享元对象的内部数据,同时可以设置外部数据。
public abstract class Flyweight {
public abstract void operation(String state);
}
2.ConcreteFlyweight(具体享元类):具体享元类实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了储存空间。通常可以结合单例模式来设计具体享元类,为每一个具体享元类提供了唯一享元对象。
public class ConcreteFlyweight extends Flyweight {
private String intrState;
public ConcreteFlyweight(String intrState) {
this.intrState = intrState;
}
@Override
public void operation(String state) {
System.out.println("具体享元类中业务"+intrState);
}
}
3.UnsharedConcreteFlyweight(非共享具体享元类):并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类,需要使用时直接实例化创建。
public class UnsharedConcreteFlyweight extends Flyweight {
@Override
public void operation(String state) {
System.out.println("非共享具体享元类业务方法!");
}
}
4.FlyweightFactory(享元工厂类):享元工厂用于创建并管理享元对象,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合或其他类型的集合。
public class FlyweightFactory {
//定义享元池
private Map <String,Object> map=new HashMap<>();
public Flyweight getFlyweight(String key) {
//获取享元池中的对象,不存在则创建,同时添加对象到享元池中。
if(map.containsKey(key)){
return (Flyweight) map.get(key);
}else {
Flyweight flyweight=new ConcreteFlyweight("");
map.put(key, flyweight);
return flyweight;
}
}
}
5.Test:
public class Test {
public static void main(String[] args) {
Flyweight flyweightA,flyweightB;
FlyweightFactory factory=new FlyweightFactory();
flyweightA=factory.getFlyweight("testA");
flyweightB=factory.getFlyweight("testA");
System.out.println("判断返回对象是否相同:"+(flyweightA==flyweightB));
//true
}
}
网友评论