享元 (Flyweight)
享元 (Flyweight) 是一种结构型设计模式,运用共享技术来有效地支持大量细粒度对象的复用。将对象中可共享的内在状态与随上下文变化的外在状态分离,在多个对象间共享内在状态,从而减少对象数量和内存占用。
- 需要创建大量细粒度对象(如字符、棋子、树节点),若每个对象都保存完整数据,内存和创建开销巨大。
- 很多对象的状态可以共享(如字符 ‘A’ 的字形),只有少量状态随使用场景变化(如位置、颜色)。
- 享元 (Flyweight):保存可共享的内在状态,提供以内在状态为参数的方法,外在状态由调用方传入。
- 享元工厂 (FlyweightFactory):缓存已创建的享元,按 key(如内在状态)返回同一实例,保证共享。
- 客户端:持有享元引用,在调用时传入外在状态(如坐标、颜色),不把外在状态存进享元。
classDiagram
class Flyweight {
<<interface>>
+operation(extrinsicState)* void
}
class ConcreteFlyweight {
-intrinsicState String
+operation(extrinsicState) void
}
class FlyweightFactory {
-cache Map
+getFlyweight(key) Flyweight
}
class Client
Flyweight <|.. ConcreteFlyweight
FlyweightFactory o-- Flyweight
Client ..> FlyweightFactory : uses
Client ..> Flyweight : uses
Java 示例
Section titled “Java 示例”public interface Flyweight { void operation(String extrinsicState);}
public class ConcreteFlyweight implements Flyweight { private final String intrinsicState; // 可共享
public ConcreteFlyweight(String intrinsicState) { this.intrinsicState = intrinsicState; }
@Override public void operation(String extrinsicState) { System.out.println("内在状态: " + intrinsicState + ", 外在状态: " + extrinsicState); }}
public class FlyweightFactory { private final java.util.Map<String, Flyweight> cache = new java.util.HashMap<>();
public Flyweight getFlyweight(String key) { return cache.computeIfAbsent(key, ConcreteFlyweight::new); }}
// 客户端public class Client { public static void main(String[] args) { FlyweightFactory factory = new FlyweightFactory(); Flyweight f1 = factory.getFlyweight("A"); Flyweight f2 = factory.getFlyweight("A"); System.out.println(f1 == f2); // true,同一享元 f1.operation("位置1"); f2.operation("位置2"); }}享元通过分离内在/外在状态并共享内在状态,在大量细粒度对象场景下显著减少实例数和内存占用。