什么是单例模式?
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)
举例:
在Nodejs中使用Axios库,我们通常用
const request=axios.create({options})
方法来创建axios的实例,使其在不同模块中共同调用该实例下的所有方法,且保证了在不同模块中不会重复性的去new Axios()实例化Axios类从而导致浪费内存空间!
使用场景:
如果我们定义一个类
class CreateMysql{
mysql:MysqlObj
constructor(){
this.mysql=connectMysql()
}
getDatabases(){
return "从数据库中读取的数据"
}
remove(data){
return `从数据库中删除了->${JSON.stringify(data)}`
}
connectMysql(){
return "连接完成数据库后对象实例"
}
}
再进行对其实例化进行使用
const mysql=new createMysql()
console.log(mysql.getDatabases())//打印:从数据库中读取的数据
操作数据库在后端开发中是频繁需要用到的,那么我们将会在不同模块或ts文件中对createMysql类进行实例化然后对数据库进行相关操作。
这样将会导致,在不同的模块或ts文件中重复性的对同一个类进行实例化,从而导致内存空间浪费或被占用!
解决:
这里我们用到类的单例模式解决该问题
创建createMysql类
class CreateMysql{
private static instance:CreateMysql|null
mysql:MysqlObj
private constructor(){
this.mysql=connectMysql()
}
getDatabases(){
return "从数据库中读取的数据"
}
remove(data){
return `从数据库中删除了->${JSON.stringify(data)}`
}
connectMysql(){
return "连接完成数据库后对象实例"
}
//定义一个init方法实例化CreateMysql类
public static init():CreateMysql{
//如果CreateMysql类中静态属性instance值为null
if(CreateMysql.instance==null){
//进行实例化CreateMysql类并赋值给instance
console.log("实例化CreateMysql类")
this.instance=new CreateMysql();
}
//返回该静态实例
return CreateMysql.instance
}
}
那么我们将可以通过CreateMysql.init()方法创建或得到一个CreateMysql实例
let instance_1=CreateMysql.init()
let instance_2=CreateMysql.init()
let instance_3=CreateMysql.init()
/*
控制台打印:
实例化CreateMysql类
*/
console.log(instance_1===instance_2)//打印:true
//这里说明我们同时创建了三个instance变量,但是CreateMysql类只进行了一次实例化
//这样可以在不同的模块中共同使用操作数据库相关的类和方法,且避免了重复性的去实例化该类