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