单例设计模式
定义
一种创建型设计模式,目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
特点
在单例模式中,类的构造函数被私有化,以防止外部直接实例化对象。 通过定义一个静态方法或属性来控制对象的实例化过程,并在第一次调用时创建该对象。随后的调用都返回已创建的唯一实例。
作用
这种设计模式常用于需要共享资源的情况,例如数据库连接、线程池等。 单例模式可以确保在整个应用程序中只存在一个实例,避免了资源浪费和不一致性的问题。
实现方式:
- 在首次调用时创建实例--
又称为是:惰性创建 - 在类加载时就创建实例
示例方式1: 禁止在类外部使用new来创建新的实例,而是通过类上的静态方法获取唯一的实例
class Singleton {
private static instance: Singleton | null = null;、
// 私有构造函数,防止外部直接实例化对象
private constructor() { }
// 定义一个静态方法或属性来控制对象的实例化过程
public static getInstance(): Singleton {
if (!Singleton.instance) {
Singleton.instance = new Singleton(); // 这里是惰性创建
}
return Singleton.instance;
}
public someMethod(): void {
console.log("This is a method of the singleton instance.");
}
}
// 在其他地方获取单例实例并调用方法
const instance1 = Singleton.getInstance();
instance1.someMethod();
const instance2 = Singleton.getInstance();
instance2.someMethod();
console.log(instance1 === instance2); // 输出: true
示例方式2: 允许使用new,但返回的仍然是唯一实例对象
class Singleton {
private static instance = new Singleton(); // 这里不是惰性创建
public constructor() {
if (Singleton.instance) return Singleton.instance;
}
public someMethod(): void {
console.log("This is a method of the singleton instance.");
}
}
// 在其他地方获取单例实例并调用方法
const instance1 = new Singleton();
instance1.someMethod();
const instance2 = new Singleton();
instance2.someMethod();
console.log(instance1 === instance2); // 输出: true
业务场景
- 全局状态管理:单例模式可以用于创建全局状态管理类,以确保应用程序中的状态是唯一的,并且可以在不同的组件或模块之间共享。
- 配置对象:单例模式可用于创建一个配置对象,该对象包含应用程序的配置信息,并且可以被整个应用程序所访问和使用。
- 日志记录器:单例模式可以用于创建一个日志记录器,以便在整个应用程序中进行日志记录,并提供统一的接口来记录和处理日志信息。
- 缓存管理器:单例模式可以用于创建一个缓存管理器,用于缓存数据、资源或计算结果,以提高应用程序的性能和效率。
- 资源池或连接池:单例模式可用于创建资源池或连接池,例如数据库连接池、线程池等,以确保资源的有效管理和共享。
- 对话框或模态框:单例模式可以用于创建对话框或模态框的实例,以确保只有一个弹出窗口在屏幕上显示,并避免重复创建多个实例。
创建单例的方式
- 使用字面量直接创建:这种方式比较简洁,但是不够灵活,不适合复杂场景,也难以让读者意识到此对象是一个单例。
- 使用class语法糖创建:使用类的静态成员实现单例的方式结构化更强,语义化更好,可维护性和可读性都更好。更重要的是,在ts中,可以使用修饰词修饰类的成员,实现更加丰富的控制。