单例模式
单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”
什么是单例模式
单例模式就是只能创建一个类的实例对象,并提供一个可以访问它的全局访问点。
单例模式的优点
- 实例控制,确保只有一个实例,防止创建多个实例副本。
- 只有一个实例的过程,可以灵活控制实例化过程。
单例模式的缺点
- 每次创建都需要判断实例是否创建的开销,可以使用静态初始化,又会导致一个新的问题,创建的实例没有被用到。
单例模式的例子
例如我们现在需要一个全局计数器,我们可以这样创建,这里使用静态初始化。
let instance;
let counter = 0;
class Counter {
constructor() {
if (instance) {
throw new Error("只能创建一个Counter实例");
}
instance = this;
}
getInstance() {
return this;
}
getCount() {
return counter;
}
increment() {
return ++counter;
}
decrement() {
return --counter;
}
}
const singletonCounter = Object.freeze(new Counter()); // 内部创建一次就够了
export default singletonCounter;
Object.freeze()
这里用到一个 Object.freeze()
方法,作用是冻结一个对象。被冻结的对象具有以下特性
- 不能添加,删除,修改属性
- 不能修改原型
- 不能修改已有属性的可枚举性,可配置性,可写性。
Object.freeze()
可以提高性能,如果你有一个对象,里面的内容特别特别多,而且都是一些静态数据,你确保不会修改它们,那你其实可以用 Object.freeze()
冻结起来,这样可以让性能大幅度提升,提升的效果随着数据量的递增而递增。