享元模式是对象池的一种实现,用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享、避免创建过多对象的效果。可以提升性能。避免内存移除等。
使用共享对象可有效地支持大量的细粒度的对象。
享元类定义
public interface Flyweight {
// 示意性方法,参数state是外部状态
public void doSomething(String externalState);
}
public class ConcreteFlyweight implements Flyweight {
//内部状态,初始化后就不变了
private String intrinsicState = null;
/**
* 构造函数,内部状态作为参数传入
*
* @param state
*/
public ConcreteFlyweight(String state) {
this.intrinsicState = state;
}
/**
* 外部状态作为参数传入方法中,改变方法的行为, 但是并不改变对象的内部状态。
*/
@Override
public void doSomething(String externalState) {
//具体的功能逻辑,可能会用到享元内部、外部状态
System.out.println("Intrinsic State = " + this.intrinsicState);
System.out.println("External State = " + externalState);
}
}
享元工厂:
public class FlyweightFactory {
private Map maps = new HashMap();
public Flyweight getFlyweight(String state) {
// 1、先从缓存中查找对象
Flyweight fly = maps.get(state);
// 2、如果对象不存在则创建一个新的享元对象
if (fly == null) {
System.out.println("享元对象池没有,新创建一个对象");
fly = new ConcreteFlyweight(state);
// 2.1、 把这个新的享元对象添加到缓存中
maps.put(state, fly);
} else {
System.out.println("在享元对象池找到缓存对象,直接返回");
}
// 3、返回享元对象
return fly;
}
}
客户端调用:
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight fly = factory.getFlyweight("男的");
fly.doSomething("写代码");
System.out.print("\n");
fly = factory.getFlyweight("女的");
fly.doSomething("做美工图片");
System.out.print("\n");
fly = factory.getFlyweight("男的");
fly.doSomething("修电脑");
}
}