1. 享元模式与JVM内存优化的不解之缘
第一次接触享元模式是在处理一个电商促销系统时,当时活动页面的商品卡片频繁创建销毁导致Young GC飙升。通过引入享元池缓存商品基础信息对象,内存占用直接减少了73%。这种"用空间换时间"的套路,本质上是对面向对象设计中"一切皆对象"理念的理性回调。
在JVM的世界里,每个new操作都要付出代价——堆内存分配、GC标记、甚至触发STW。当系统中存在大量细粒度重复对象时(比如棋牌游戏的牌面图案、文档编辑器的字符格式),享元模式通过共享元数据,让1个对象扛起原本需要100个对象的活。这就像疫情期间的共享单车,同一辆车被不同人分时段使用,总投放量减少但服务能力不变。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 享元模式的双层设计哲学
2.1 内在状态与外在状态的分离艺术
享元模式最精妙之处在于状态分离。以我实现的HTML渲染引擎为例:
- 内在状态:字体名称、字号、颜色等样式属性(被共享)
- 外在状态:字符坐标、绘制顺序等上下文信息(每次绘制时传入)
java复制// 享元接口
interface TextStyle {
void render(String text, Position position);
}
// 具体享元
class ConcreteTextStyle implements TextStyle {
private final String font;
private final int size;
private final String color;
// 构造器私有化,强制通过工厂获取
private ConcreteTextStyle(String font, int size, String color) {
this.font = font;
this.size = size;
this.color = color;
}
@Override
public void render(String text, Position position) {
System.out.printf("Render '%s' at (%d,%d) with %s-%dpx-%s
