工厂模式通过统一接口解耦存储创建逻辑,封装localstorage、sessionstorage和indexeddb的差异,提供标准化set/get/remove方法,自动处理json序列化、indexeddb异步初始化及错误统一包装。

工厂模式本身不负责“美化设计”,而是通过统一接口解耦创建逻辑。用它来合并管理三种存储的初始化入口,核心目标是:让调用方不用关心底层用的是哪种存储、怎么打开数据库、是否需要兼容处理——只传配置,拿到一个具备 set、get、remove 等标准方法的对象。
为什么需要工厂封装这三者
直接混用 localStorage、sessionStorage 和 IndexedDB 会带来明显问题:
- API 不一致:前两者是同步键值对操作,IndexedDB 是异步、需建库、开事务、定义对象仓库
- 错误处理分散:每个地方都要写 try/catch 或 .catch,重复且易遗漏
- 初始化时机混乱:比如 IndexedDB 首次打开可能耗时,若每次操作都检查连接状态,逻辑冗余
- 类型不安全:localStorage/sessionStorage 只存字符串,但业务常要存对象,JSON 序列化/反序列化容易漏写或出错
工厂类的设计要点
一个实用的 StorageFactory 应该做到三件事:
- 识别类型并路由:根据传入的 type(如 'local' / 'session' / 'indexeddb')决定实例化哪个具体类
- 统一返回契约接口:所有实例都实现 { set(key, value), get(key), remove(key), clear() },其中 value 支持任意可序列化类型(自动 JSON 处理)
- 隐藏 IndexedDB 初始化细节:首次调用时自动完成 open、版本升级、对象仓库创建,后续复用已打开的 db 实例
关键代码结构示意
不需要全量代码,但需明确骨架和关键约定:
- 工厂函数
createStorage({ type, name?, version?, storeName? }),返回 Promise - 抽象基类
StorageAdapter定义公共方法签名,强制子类实现 -
LocalStorageAdapter和SessionStorageAdapter是轻量同步实现,内部自动做 JSON.stringify / parse -
IndexedDBAdapter是异步实现,内部维护单例 db 连接,所有读写都基于已就绪的 db 实例;set/get 均返回 Promise - 错误统一包装为
StorageError类型,含 code(如 'DB_OPEN_FAILED'、'QUOTA_EXCEEDED')和 message
实际使用示例
业务层调用变得干净直接:
```js// 初始化三种存储实例
const local = await createStorage({ type: 'local' });
const session = await createStorage({ type: 'session' });
const idb = await createStorage({
type: 'indexeddb',
name: 'myAppDB',
version: 2,
storeName: 'userCache'
});
// 使用方式完全一致
await local.set('theme', { mode: 'dark' });
session.set('formDraft', { name: 'Alice', email: 'a@b.c' });
await idb.set('profile_123', { name: 'Alice', avatar: '/img/a.png' });
// 读取也一样,自动反序列化
const theme = await local.get('theme'); // { mode: 'dark' }
```











