Java 设计模式之享元模式
概述
- 享元模式(Flyweight):通过共享对象来减少内存使用和提高性能。
- 场景:当系统中存在大量相似对象时,当这些对象的大部分状态可以外部化时,当需要减少内存占用时。
UML图
- Flyweight:享元接口,包含一个方法用于处理外部状态。
- ConcreteFlyweight:具体享元类,包含内部状态和外部状态。
- FlyweightFactory:享元工厂类,负责创建和管理享元对象,内部维护另一个对象池。
内部状态和外部状态:
- 内部状态(intrinsisState):存储在享元对象内部,可以共享的状态。
- 外部状态(extrinsicState):由客户端传递,不能共享的状态。
代码实现
定义享元接口:
public interface Flyweight {
// 外部状态
void operation(String extrinsicState);
}
定义具体享元类:
public class ConcreteFlyweight implements Flyweight {
private String intrinsicState; // 内部状态
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
@Override
public void operation(String extrinsicState) {
System.out.println("内部状态:" + intrinsicState);
System.out.println("外部状态:" + extrinsicState);
}
}
定义享元工厂:
public class FlyweightFactory {
private HashMap<String, Flyweight> flyweights = new HashMap<String, Flyweight>();
public Flyweight getFlyweight(String key) {
if (flyweights.containsKey(key)) {
return flyweights.get(key);
} else {
Flyweight flyweight = new ConcreteFlyweight(key);
flyweights.put(key, flyweight);
return flyweight;
}
}
}
使用:
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight flyweight1 = factory.getFlyweight("A");
flyweight1.operation("state1");
Flyweight flyweight2 = factory.getFlyweight("B");
flyweight2.operation("state2");
Flyweight flyweight3 = factory.getFlyweight("A");
flyweight3.operation("state3");
System.out.println("flyweight1 == flyweight2:" + (flyweight1 == flyweight2));
System.out.println("flyweight3 == flyweight2:" + (flyweight3 == flyweight2));
}
}
输出:
内部状态:A
外部状态:state1
内部状态:B
外部状态:state2
内部状态:A
外部状态:state3
flyweight1 == flyweight2:false
flyweight3 == flyweight2:false