享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少创建对象的数量,以节省内存和提高性能。这个模式通过共享尽可能多的细节来有效地支持大量细粒度对象。
享元模式通过将多个对象的共享部分提取出来,只保留它们之间的差异,从而减少内存的使用。这种共享的部分称为“享元”(Flyweight),而不共享的部分则称为“非享元状态”。
享元模式的实现可以分为两个状态:内部状态和外部状态。内部状态是存储在享元对象内部的共享状态,不会随环境改变而改变;外部状态是随环境改变的不可共享状态,必须由客户端自行维护。
// 享元接口
public interface Flyweight {
void operation(String externalState);
}
// 具体享元类
public class ConcreteFlyweight implements Flyweight {
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
@Override
public void operation(String externalState) {
System.out.println("Intrinsic State = " + intrinsicState + ", External State = " + externalState);
}
}
// 享元工厂
import java.util.HashMap;
import java.util.Map;
public class FlyweightFactory {
private Map<String, Flyweight> flyweights = new HashMap<>();
public Flyweight getFlyweight(String key) {
if (!flyweights.containsKey(key)) {
flyweights.put(key, new ConcreteFlyweight(key));
}
return flyweights.get(key);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight flyweight1 = factory.getFlyweight("A");
flyweight1.operation("First Call");
Flyweight flyweight2 = factory.getFlyweight("A");
flyweight2.operation("Second Call");
Flyweight flyweight3 = factory.getFlyweight("B");
flyweight3.operation("Third Call");
}
}
总的来说,享元模式在需要高效管理大量相似对象的场景下非常有用,但在实现时需要仔细设计以平衡性能和复杂性。