zhangdizhangdi

享元模式 📖

定义

享元模式(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

    1. 缓存
    1. 事件委托

参考