多态通过统一接口调用保障享元复用,具体体现为:①享元接口定义行为契约,客户端依赖接口编程;②具体享元实现同一接口并共享内在状态;③工厂返回接口类型,隐藏实现细节与复用逻辑。

Java 利用多态实现享元模式中的对象复用,关键不在于“靠多态创建对象”,而在于通过多态统一调用接口,让不同具体享元对象对外呈现一致行为,从而在客户端无需关心具体类型的前提下完成复用。多态在这里是支撑共享机制的“能力底座”,不是复用的直接手段——真正实现复用的是享元工厂 + 内在/外在状态分离。
下面从三个核心环节说明多态如何参与并保障复用:
享元接口定义统一行为契约
抽象享元(Flyweight)是一个接口或抽象类,它声明了所有具体享元共有的操作方法(如 display()、render())。
客户端只依赖这个接口编程,不与具体类耦合。
public interface CharacterFlyweight {
void display(int x, int y); // 外在状态通过参数传入
}
✅ 多态作用:CharacterFlyweight c = factory.getCharacter('A'); 这行代码中,c 的编译时类型是接口,运行时可能是 ConcreteCharacterA 或 ConcreteCharacterB,但调用 c.display(10,20) 总能正确执行对应逻辑。
具体享元各自实现,共享内在状态
每个具体享元类(如 ConcreteCharacter)实现同一接口,但内部只保存不可变的内在状态(如字符值、字体、字号),且构造后不再修改。
public class ConcreteCharacter implements CharacterFlyweight {
private final char value;
private final String font;
private final int size;
public ConcreteCharacter(char value, String font, int size) {
this.value = value;
this.font = font;
this.size = size;
}
@Override
public void display(int x, int y) {
System.out.printf("渲染 '%c'(%s, %dpt)于 (%d,%d)%n",
value, font, size, x, y);
}
}
✅ 多态作用:多个不同字符('A'、'B'、'0')可对应不同 ConcreteCharacter 实例,但都实现 CharacterFlyweight,客户端调用方式完全一致——复用逻辑对使用者透明。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
工厂返回接口类型,隐藏具体实现细节
享元工厂内部用 Map<character characterflyweight></character> 缓存已创建的对象,并在 getCharacter() 中返回接口类型:
public class CharacterFactory {
private final Map<character characterflyweight> pool = new HashMap();
public CharacterFlyweight getCharacter(char c) {
return pool.computeIfAbsent(c, ch ->
new ConcreteCharacter(ch, "Arial", 12));
}
}</character>
✅ 多态作用:客户端拿到的是 CharacterFlyweight 引用,完全不知道背后是新建的还是复用的;也不需要 instanceof 或强制转型——这正是多态解耦 + 复用得以落地的前提。
简单说:
- 没有多态 → 客户端得为每种字符写不同调用代码,无法统一管理,复用就失去意义;
- 有多态 + 工厂 + 状态分离 → 才能让
c1和c3都是'A'时自动指向同一个对象,且调用方式不变。
复用靠工厂查缓存,安全靠内在状态不可变,而多态让这一切对上层透明、灵活、可扩展。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










