# 什么是单例模式
- 只能被实例化一次
- 实例在应用中共享
- 在应用中维护全局状态
# 单例模式实现
- 为了防止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可以改变状态
