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