享元模式 📖
定义
享元模式(Flyweight Pattern),主要用于减少创建对象的数量,以减少内存占用和提高性能。
能复用的对象就别重复创建。
状态划分
享元模式要求将对象的属性划分为内部状态与外部 状态(状态在这里通常指属性)。享元模式的目标是尽量减少共享对象的数量,关于如何划分内部状态和外部状态,下面的几条经验提供了一些指引:
- 内部状态存储于对象内部
- 内部状态可以被一些对象共享
- 内部状态独立于具体的场景,通常不会改变
- 外部状态取决于具体的场景,并根据场景而变化,外部状态不能被共享
何时使用
- 一个程序中使用了大量的相似对象
- 由于使用了大量对象,造成很大的内在开销
- 对象的大多数状态都可以变为外部状态
- 剥离出对象的外部状态之后,可以用相对较少的共享对象取代大量对象
实现
js
class FlyweightFactory {
constructor() {
this.cache = {}
}
get(type) {
if (!this.cache[type]) {
this.cache[type] = new Flyweight(type)
}
return this.cache[type]
}
}
class Flyweight {
constructor(type) {
this.type = type // 内部状态
}
render(x, y) {
console.log(this.type, x, y) // 外部状态
}
}
// 使用
const factory = new FlyweightFactory()
const btn1 = factory.get('button')
btn1.render(10, 20)
const btn2 = factory.get('button')
btn2.render(30, 40)
👉 ✔️ btn1 === btn2(共享)
👉 ✔️ x,y 不同(外部状态)
前端应用
1. 虚拟列表
👉 10000 条数据:
❌ 创建 10000 DOM
✅ 只创建可视区域(几十个)
2. React / Vue 组件复用
👉 相同组件结构:
共享逻辑
不同 props
-
- 缓存
-
- 事件委托