1. 什么是单例模式
单例模式的定义是:在任何时候,一个类只能有一个实例,并提供一个访问它的全局访问点。
即便多次创建,所得到的实例也和第一次创建的实例相等。
2. 单例模式示例
在JS中实现单例模式的方式有很多。得益于JS的灵活性,可以不需要显式的定义一个类,就可以实现单例。
比如直接通过使用let或const创建全局变量的方式来实例化一个对象。
又或者是通过闭包来实现单例,通过闭包实现单例的方式,感觉也比较符合函数式编程的风格。
通过定义对象字面量的方式来创建一个单例
arduino
const singleton = {
name: 'xxx',
age: 18
}
通过闭包实现单例模式
ini
//定义一个封装了一些方法的函数,比如useXXX之类的
const singleton = () => {
return {
name: '张三',
age: 18
}
}
//定义一个全局访问的闭包
const getInstance = (() => {
let instance = null;
return () => {
if(!instance) {
instance = singleton();
}
return instance;
}
})();
const singleton1 = getInstance();
const singleton2 = getInstance();
//不在同一块内存中的对象严格相等的结果是false。这里打印 true,说明成功了
console.log(singleton1 === singleton2);
同样的,JS也能够和其它语言一样,定义一个类来实现单例
使用构造函数实现单例模式
ini
class SingletonDemo {
//创建一个静态属性,它只属于类本身,而不属于实例
static instance = null;
constructor() {
//将首次创建的实例保存在静态属性instance中
if(!SingletonDemo.instance) {
SingletonDemo.instance = this;
}
return SingletonDemo.instance;
}
}
const singleton1 = new SingletonDemo();
const singleton2 = new SingletonDemo();
//打印 true
console.log(singleton1 === singleton2);
使用静态方法实现单例模式
ini
class SingletonDemo {
//创建一个静态方法充当全局访问点
static getInstance() {
if(!SingletonDemo.instance) {
//动态创建了一个静态属性instance
SingletonDemo.instance = new SingletonDemo();
}
return SingletonDemo.instance;
}
}
const singleton1 = SingletonDemo.getInstance();
const singleton2 = SingletonDemo.getInstance();
//打印 true
console.log(singleton1 === singleton2);