单例设计模式在Js中的使用

171 阅读3分钟

单例设计模式

定义

一种创建型设计模式,目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。

特点

在单例模式中,类的构造函数被私有化,以防止外部直接实例化对象。 通过定义一个静态方法或属性来控制对象的实例化过程,并在第一次调用时创建该对象。随后的调用都返回已创建的唯一实例。

作用

这种设计模式常用于需要共享资源的情况,例如数据库连接、线程池等。 单例模式可以确保在整个应用程序中只存在一个实例,避免了资源浪费和不一致性的问题。

实现方式:

  1. 首次调用时创建实例--又称为是:惰性创建
  2. 类加载时就创建实例

示例方式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

业务场景

  1. 全局状态管理:单例模式可以用于创建全局状态管理类,以确保应用程序中的状态是唯一的,并且可以在不同的组件或模块之间共享
  2. 配置对象:单例模式可用于创建一个配置对象,该对象包含应用程序的配置信息,并且可以被整个应用程序所访问和使用。
  3. 日志记录器:单例模式可以用于创建一个日志记录器,以便在整个应用程序中进行日志记录,并提供统一的接口来记录和处理日志信息。
  4. 缓存管理器:单例模式可以用于创建一个缓存管理器,用于缓存数据、资源或计算结果,以提高应用程序的性能和效率。
  5. 资源池或连接池:单例模式可用于创建资源池或连接池,例如数据库连接池、线程池等,以确保资源的有效管理和共享。
  6. 对话框或模态框:单例模式可以用于创建对话框或模态框的实例,以确保只有一个弹出窗口在屏幕上显示,并避免重复创建多个实例。

创建单例的方式

  1. 使用字面量直接创建:这种方式比较简洁,但是不够灵活,不适合复杂场景,也难以让读者意识到此对象是一个单例。
  2. 使用class语法糖创建:使用类的静态成员实现单例的方式结构化更强,语义化更好,可维护性和可读性都更好。更重要的是,在ts中,可以使用修饰词修饰类的成员,实现更加丰富的控制。