如何实现一个单例模式?

推荐答案

-- -------------------- ---- -------
----- --------- -
  ------------- -
    -- -------------------- -
      ------ -------------------
    -
    ------------------ - -----
    --------- - -------- ------ -- ----
  -

  --------- -
    ------ ----------
  -

  ---------------- -
    --------- - --------
  -
-


-- ----
----- --------- - --- ------------
----- --------- - --- ------------

--------------------- --- ----------- -- ----
--------------------------------- -- ------- ----
-------------------------- -------
--------------------------------- -- ------- ----

本题详细解读

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在JavaScript中,可以使用多种方法实现单例模式。上述推荐答案展示了使用静态属性在类内部维护实例的常见方法,下面详细解析其原理和实现步骤:

  1. 静态属性 instanceSingleton 内部定义了一个静态属性 instance,用于存储唯一的实例。初始值为 undefined

  2. 构造函数中的逻辑: 构造函数 constructor 是实现单例模式的关键。

    • 检查实例是否存在: 首先,它检查 Singleton.instance 是否已经存在(即是否已经创建过实例)。如果已经存在,则直接返回已有的实例,而不会创建新的实例。
    • 创建并存储实例: 如果 Singleton.instance 不存在,则创建当前类的实例,并将其赋值给 Singleton.instance,同时初始化一些实例数据。
  3. 实例方法 getDatasetData 这两个方法提供了访问和修改单例实例内部数据的方法,它们是实例的方法,而非类的方法。

  4. 使用示例: 通过 new Singleton() 创建两个实例 instance1instance2。因为单例模式的特性,这两个变量实际上引用的是同一个实例。

    • instance1 === instance2 返回 true,验证了只有一个实例。
    • 对一个实例的数据进行修改,另一个实例的数据也会同步更新,因为它们是同一个实例。

为什么使用这种方式实现单例模式?

  • 控制实例数量: 保证了在整个应用程序中只有一个实例存在,避免了资源浪费和状态不一致问题。
  • 全局访问点: 通过 Singleton.instance 可以方便地在任何地方访问这个唯一的实例。
  • 惰性初始化: 只有在第一次调用 new Singleton() 时才会创建实例,提高了程序的性能,避免了不必要的资源消耗。

其他实现单例模式的方式:

除了使用类的静态属性,还可以使用闭包等方式实现单例模式,例如:

-- -------------------- ---- -------
----- --------- - ----------- -
  --- ---------
  ------ ---------- -
    -- ---------- -
      ------ ---------
    -
    -------- - -----
    --------- - -------- ------ -- ----
    ------ ---------
  --
-----


--------
----- --------- - --- ------------
----- --------- - --- ------------
--------------------- --- ----------- -- ----
---------------------------- -- ------- ----
-------------- - -------- ------
---------------------------- -- ------- ----

这种方式使用了立即执行函数表达式(IIFE)创建了一个闭包,利用闭包来保存 instance 变量。

纠错
反馈