searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

[ patterns.dev ]单例模式 in Javascript

2023-05-25 01:06:09
3
0

# 什么是单例模式

- 只能被实例化一次
- 实例在应用中共享
- 在应用中维护全局状态

# 单例模式实现

- 为了防止Counter被多次初始化,用一个全局变量instance去记录,如果已经被初始化过,则抛出错误
- 使用`Object.freeze`方法防止实例的方法和属性在使用的时候被修改
- 最后导出ES Module

// 实现单例模式
let instance

class Counter {
  constructor() {
    if (instance) {
      throw Error('Counter has been instantiated')
    } else {
      this.count = 0
      instance = this
    }
  }
  getInstance () {
    return instance
  }
  getCount() {
    return this.count
  }
  increasement() {
    this.count += 1
  }
  decreasement() {
    this.count -= 1
  }
}

const counter = Object.freeze(new Counter())
export default counter

# 单例模式的缺点

- 由于单例模式的实例是全局共享的,所以在使用的时候被修改可能会导致奔溃
- 测试的时候因为不能创建新的实例用于测试,与应用使用同一个实例可能会导致错误
- 可能存在依赖隐藏的问题,如果另一个类在单例模式的实例之上进行封装,在应用的其他地方改变状态,也会影响到当前类

# 单例模式的使用场景

- 需要管理全局状态
- 需要节省内存(虽然不多

# 个人看法

在javascript中单例模式完全可以被对象替代,创建一个包含相应方法的对象,并将其freeze,再导出,效果和class或function一致。如果是用来存字典,工具函数,用单例模式还不错,不过聊胜于无,节省一些内存。

# React 中的状态管理

React中的状态管理工具Redux也是全局状态管理工具,但是它和单例模式不同,它提供了read-only 模式,只有reducers可以改变状态

0条评论
0 / 1000