享元模式
介绍
享元模式通过共享技术从而实现相同或者相似的对象的重用,从而达到降低系统开销的目的,一般与工厂模式结合使用,包含一个享元工厂类
内部状态
内部状态是指存储在享元模式内部并且不会随环境改变而改变的状态,内部状态可以共享
外部状态
外部状态是随环境改变而改变的不可以共享的状态,通常由客户端进行维护,在需要使用的时候传入到内部
角色
- Flyweight(抽象享元类):一般是接口或者抽象类,其中声明了公共方法,该方法可以向外界提供享元对象的内部数据,同时也可以设置外部数据
- ConcreteFlyweight(具体享元类):实现抽象享元类声明的方法,其中存储了内部状态
- UnsharedConcreteFlyweight(非共享具体享元类)
- FlyweightFactory(享元工厂类):创建并管理享元对象,针对抽象享元类编程
示例代码
//抽象享元类
public abstract class Flyweight {
//内部状态作为成员变量
private String intrinsicState;
public Flyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
//外部状态在使用是由外部设置,不保存在享元对象中
public void operation(String extrinsicState) {
System.out.println(intrinsicState + " - 外部状态设置:" + extrinsicState);
}
}
//具体享元对象类A
public class ConcreteFlyweightA extends Flyweight {
public ConcreteFlyweightA() {
super("A");
}
}
//具体享元对象类B
public class ConcreteFlyweightB extends Flyweight {
public ConcreteFlyweightB() {
super("B");
}
}
//享元工厂类
public class FlyweightFactory {
private HashMap<String, Flyweight> flyweights = new HashMap<>();
public FlyweightFactory() {
flyweights.put("A", new ConcreteFlyweightA());
flyweights.put("B", new ConcreteFlyweightB());
}
public Flyweight getFlyweight(String key) {
if (flyweights.containsKey(key)) {
return flyweights.get(key);
} else {
return null;
}
}
}
//客户端
public class Client {
public static void main(String[] args) {
FlyweightFactory flyweightFactory = new FlyweightFactory();
Flyweight flyweightA1 = flyweightFactory.getFlyweight("A");
Flyweight flyweightA2 = flyweightFactory.getFlyweight("A");
Flyweight flyweightB1 = flyweightFactory.getFlyweight("B");
flyweightA1.operation("外部状态A1");
flyweightA2.operation("外部状态A2");
flyweightB1.operation("外部状态B1");
System.out.println(flyweightA1 == flyweightA2);
System.out.println(flyweightB1 == flyweightA1);
}
}