其他
大量相似对象导致内存压力时…
应用需要创建大量相似对象,且这些对象共享较多内在属性、内存消耗成为关注点时适用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
大量相似对象导致内存压力时,用享元模式分通用
解决思路
- 分离内在(共享)状态与外在(唯一)状态。
- 识别可共享的内在属性(例如相同 ISBN 的书),并将其作为复用共享实例的依据。
- 不要为同一类型的每份副本都创建全新实例;只创建或复用代表该类型的共享实例。
- 定义 Book 类,在 constructor(title, author, isbn) 中保存 title、author、isbn 这些共享内在属性。
- 使用 Map 或类似结构缓存并复用共享对象实例。
- 创建缓存容器,例如 const books = new Map();。
- 实现 createBook(title, author, isbn):用 books.has(isbn) 判断该 ISBN 的书是否已缓存。
- 如果已存在,直接 return books.get(isbn) 返回已缓存实例。
- 如果不存在,创建 const book = new Book(title, author, isbn);,用 books.set(isbn, book) 存入缓存,并 return book。
- 创建 bookList 数组来跟踪图书馆中的总副本数量。
- 实现 addBook(title, author, isbn, availability, sales):先调用 createBook(title, author, isbn) 获取共享 Book 实例。
- 在 addBook 中,将 createBook(title, author, isbn) 返回的共享实例展开为副本对象,例如 {...createBook(title, author, isbn)}。
- 在副本对象中加入每份副本独有的外在状态 sales、availability、isbn。
- 将副本对象 push 到 bookList,并返回该对象。
- 添加多份相同书时复用同一个 Book 实例;例如对 3 种书添加 5 份副本,最终只创建 3 个 Book 实例。
- 考虑 JavaScript 的原型继承(prototypal inheritance)作为许多情况下更简单的替代方案。
适用边界 · 注意事项
- 对象数量小到内存不成问题时;硬件已有 GB 级 RAM 且内存不紧张时,享元模式通常不那么重要。
- 对象几乎没有共享内在属性时;分离内在/外在状态只会增加复杂度而没有节省。
- 新增的查找/管理开销超过内存收益时。