跳转到内容

享元 (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
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");
}
}

享元通过分离内在/外在状态并共享内在状态,在大量细粒度对象场景下显著减少实例数和内存占用。