Skip to content

Singleton Pattern

保证一个类只有一个实例,并且提供一个全局访问点

Why use Singleton Pattern

在程序开发中,有些对象只需要一个,多了反而会出现乱子或浪费资源

  • 节省内存: 比如数据库连接池、缓存对象,频繁创建和销毁非常消耗性能
  • 避免冲突: 比如网页中的“登录弹窗”。如果用户点击多了。界面就会乱套。单例可以保证全局只存在一个弹窗实例。
  • 数据共享:全局的状态管理(如状态管理库 Redux、Vuex 等),需要一个统一的地方来存放数据

Code

Singleton.js
javascript
const Singleton = (function () {
  let instance = null // 私有变量,存储唯一实例

  function createInstance() {
    return { name: 'StorageInstance', data: [] }
  }

  return {
    getInstance: function () {
      if (!instance) {
        instance = createInstance()
      }
      return instance
    }
  }
})()

const instance1 = Singleton.getInstance()
const instance2 = Singleton.getInstance()
console.log(instance1 === instance2) // true

Conclusion

缺点:

  • 隐藏依赖:代码之间耦合度变高,很难看清数据是从哪来
  • 扩展困难: 单例类职责过重,违背了单一职责原理
  • 测试不便:在单元测试中,单例的状态可能会干扰后续测试

优点:

  • 节省资源
  • 全局同步