**享元模式**（英語：Flyweight Pattern）是一種軟體設計模式。它使用物件用來儘可能減少記憶體使用量；於相似物件中分享儘可能多的資訊。當大量物件近乎重複方式存在，因而使用大量記憶體時，此法適用。通常物件中的部分狀態(state)能夠共享。常見做法是把它們放在資料結構外部，當需要使用時再將它們傳遞給享元。

典型的享元模式的例子為文書處理器中以圖形結構來表示字符。一個做法是，每個字形有其字型外觀, 字模 metrics, 和其它格式資訊，但這會使每個字符就耗用上千位元組。取而代之的是，每個字符參照到一個共享字形物件，此物件會被其它有共同特質的字符所分享；只有每個字符（文件中或頁面中）的位置才需要另外儲存。

示例
--

### Java

以下程式用來解釋上述的文字。這個例子用來解釋享元模式利用只加載执行任務时所必需的最少資料，因而減少記憶體使用量。

```
public enum FontEffect {
 BOLD, ITALIC, SUPERSCRIPT, SUBSCRIPT, STRIKETHROUGH
}

public final class FontData {
 /\*\*
 \* A weak hash map will drop unused references to FontData.
 \* Values have to be wrapped in WeakReferences, 
 \* because value objects in weak hash map are held by strong references.
 \*/
 private static final WeakHashMap<FontData, WeakReference<FontData>> FLY\_WEIGHT\_DATA =
 new WeakHashMap<FontData, WeakReference<FontData>>();
 private final int pointSize;
 private final String fontFace;
 private final Color color;
 private final Set<FontEffect> effects;

 private FontData(int pointSize, String fontFace, Color color, EnumSet<FontEffect> effects) {
 this.pointSize = pointSize;
 this.fontFace = fontFace;
 this.color = color;
 this.effects = Collections.unmodifiableSet(effects);
 }

 public static FontData create(int pointSize, String fontFace, Color color,
 FontEffect... effects) {
 EnumSet<FontEffect> effectsSet = EnumSet.noneOf(FontEffect.class);
 for (FontEffect fontEffect : effects) {
 effectsSet.add(fontEffect);
 }
 // We are unconcerned with object creation cost, we are reducing overall memory consumption
 FontData data = new FontData(pointSize, fontFace, color, effectsSet);

 // Retrieve previously created instance with the given values if it (still) exists
 WeakReference<FontData> ref = FLY\_WEIGHT\_DATA.get(data);
 FontData result = (ref != null) ? ref.get() : null;
 
 // Store new font data instance if no matching instance exists
 if (result == null) {
 FLY\_WEIGHT\_DATA.put(data, new WeakReference<FontData> (data));
 result = data;
 }
 // return the single immutable copy with the given values
 return result;
 }

 @Override
 public boolean equals(Object obj) {
 if (obj instanceof FontData) {
 if (obj == this) {
 return true;
 }
 FontData other = (FontData) obj;
 return other.pointSize == pointSize && other.fontFace.equals(fontFace)
 && other.color.equals(color) && other.effects.equals(effects);
 }
 return false;
 }

 @Override
 public int hashCode() {
 return (pointSize \* 37 + effects.hashCode() \* 13) \* fontFace.hashCode();
 }

 // Getters for the font data, but no setters. FontData is immutable.
}

```

外部連結
----

* UML 和 LePUS3 （一種形式塑模語言）中的享元模式
* "使你的程式飛起來 - 實作享元以改善效能 （页面存档备份，存于）"
* "享元模式"
* 結構模式 - 享元模式

  


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
软件设计模式 |
| --- |
|  |
| 设计模式 | 

|  |  |
| --- | --- |
| 创建型 | 
* 抽象工厂
* 生成器
* 工厂方法
* 惰性初始
* 原型
* 单例

 |
|  |
| 结构型 | 
* 适配器
* 桥接
* Composite（英语：）
* 修饰
* 外观
* 享元
* 代理

 |
|  |
| 行为型 | 
* 责任链
* 命令
* Interpreter（英语：）
* 迭代器
* 中介者
* Memento（英语：）
* 观察者
* Specification（英语：）
* State（英语：）
* 策略
* 模板方法
* 访问者

 |

 |
|  |
| 并行模式 | 
* 主动对象（英语：）
* 阻止（英语：）
* Binding properties（英语：）
* 双重检查锁定模式
* 异步方法调用
* Future与promise
* Guarded suspension（英语：）
* Join（英语：）
* 锁
* Messaging（英语：）
* 监视器
* Proactor（英语：）
* 反应器
* 读写锁
* 调度
* 线程池
* 线程局部存储

 |
|  |
| 架构模式 | 
* ADR（英语：）
* 主动记录
* Broker（英语：）
* 主從式架構
* cbd
* DAO
* DDD
* Data transfer object（英语：）
* Front controller（英语：）
* Identity map（英语：）
* Interceptor（英语：）
* 控制反转
* MVC
* 微服務
* MVP
* 單體式應用程式
* 多层架构
* *n*-tier（英语：）
* Naked objects（英语：）
* P2P
* 发布/订阅
* REST
* SOA
* Specification（英语：）

 |
|  |
| 云分布式 | 
* 断路器
* CQRS（英语：）
* 补偿交易（英语：）
* 索引表
* 领导者选举（英语：）
* MapReduce
* 物化视图（英语：）
* 管道
* 过滤器（英语：）
* 发布/订阅
* 分片（英语：）
* 节流（英语：）

 |
|  |
| 其他模式 | 
* Blackboard（英语：）
* Business delegate（英语：）
* Composite entity（英语：）
* 委托
* 依赖注入
* Intercepting filter（英语：）
* 惰性載入
* Method chaining（英语：）
* 模拟对象
* 空对象
* 对象池
* Servant（英语：）
* Twin（英语：）
* Type tunnel（英语：）

 |
|  |
| 书籍 | 
* 设计模式：可复用面向对象软件的基础
* 企业集成模式（英语：）

 |
|  |
| 人物 | 
* 克里斯托佛·亚历山大
* 埃里希·伽瑪
* Ralph Johnson（英语：）
* John Vlissides（英语：）
* 葛來迪·布區
* 肯特·貝克
* 沃德·坎宁安
* 马丁·福勒
* Robert Martin（英语：）
* Jim Coplien（英语：）
* Douglas Schmidt（英语：）
* Linda Rising

 |
|  |
| 社区 | 
* The Hillside Group（英语：）
* The Portland Pattern Repository（英语：）

 |

 |