单例模式
单例模式指的是一个类只能有一个实例存在。
在实际应用中有些场景我们只需要唯一实例的存在,如果出现多个实例就会出现问题,这个时候我们就需要用到单例模式。比如线程池,缓存,硬件设备等。
实现思路
每个类中都有一个构造函数 constructor
,当我们 new
这个类时,实际上就是在调用这个构造函数。比如我们定义了一个 Car
类,实例化了一只叫“茶”的小猫咪和一只叫“菊”的小猫咪。此时我们声明了两个 Car
的实例。
class Car {
name: string
constructor(name) {
this.name = name
}
}
const cha = new Car('茶')
const ju = new Car('菊')
如果我们把构造函数变成私有函数,外部就无法将这个类实例化。
所以,只要我们把一个类的构造函数私有化,并在类内部实例化出唯一的一个实例,就可以实现单例模式了。
class Singleton {
private constructor() {
// 初始化
}
// 声明一个私有的静态属性作为唯一的实例
private static INSTANCE: Singleton = new Singleton()
// 暴露一个公开的方法用于获取实例
public getInstance() {
return Singleton.INSTANCE
}
}
饿汉模式和懒汉模式
单例模式又分为饿汉模式和懒汉模式
- 饿汉模式:指全局的单例实例在类装载时构建
- 懒汉模式:指全局的单例实例在第一次被使用时构建
饿汉模式
class Singleton {
private constructor() {
// 初始化
}
// 声明一个私有的静态属性作为唯一的实例
private static INSTANCE: Singleton = new Singleton()
// 暴露一个公开的方法用于获取实例
public getInstance() {
return Singleton.INSTANCE
}
}
饿汉模式
class Singleton {
private constructor() {
// 初始化
}
// 声明一个私有的静态属性作为唯一的实例
private static INSTANCE?: Singleton = null
// 暴露一个公开的方法用于获取实例
public getInstance() {
if (!Singleton.INSTANCE) {
Singleton.INSTANCE = new Singleton()
}
return Singleton.INSTANCE
}
}