返回

JavaScript 设计模式(一):单例模式

前端

单例模式:一个简洁的概览

单例模式是一种创建型设计模式,其核心思想是保证全局范围内某个类只有一个实例。在JavaScript中,它通常被用于管理全局状态、提供全局访问的资源,以及保证对象创建的一致性。

单例模式的常见应用场景

单例模式在 JavaScript 中拥有广泛的应用场景,包括:

  1. 全局配置管理:可以通过单例模式集中管理全局配置,方便程序在不同模块间共享数据。
  2. 线程池管理:单例模式可以用来管理线程池,确保线程池只被创建一次,并提供统一的线程访问接口。
  3. 全局缓存:单例模式可以用来管理全局缓存,确保缓存只被创建一次,并提供统一的缓存访问接口。
  4. window 对象:在浏览器环境中,window 对象是一个单例,它提供了对浏览器窗口的访问。
  5. 数据库连接池:数据库连接池是一个单例,它管理着所有数据库连接,并提供统一的连接接口。

JavaScript 中的六种单例模式实现方法

1. 立即执行函数

最简单的方式是使用立即执行函数,在函数内部定义一个变量来保存实例,并返回该变量。这种方式的好处是简单易懂,但无法实现延迟实例化,也不适合模块化开发。

const Singleton = (function () {
  let instance;

  function createInstance() {
    const object = new Object();
    return object;
  }

  return {
    getInstance: function () {
      if (!instance) {
        instance = createInstance();
      }
      return instance;
    },
  };
})();

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true

2. 闭包

闭包是一种实现单例模式的常见方法,它利用了 JavaScript 的作用域特性。在闭包中,一个内部函数可以访问外部函数的变量,但外部函数无法访问内部函数的变量。

function Singleton() {
  let instance;

  function createInstance() {
    const object = new Object();
    return object;
  }

  return {
    getInstance: function () {
      if (!instance) {
        instance = createInstance();
      }
      return instance;
    },
  };
}

const instance1 = Singleton().getInstance();
const instance2 = Singleton().getInstance();
console.log(instance1 === instance2); // true

3. 模块化

在 JavaScript 中,模块化是一种将代码组织成独立模块的方式。每个模块都有自己的作用域,可以防止变量冲突。利用模块化,我们可以实现单例模式。

// Singleton.js
export const Singleton = (function () {
  let instance;

  function createInstance() {
    const object = new Object();
    return object;
  }

  return {
    getInstance: function () {
      if (!instance) {
        instance = createInstance();
      }
      return instance;
    },
  };
})();

// main.js
import { Singleton } from './Singleton.js';

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true

4. 对象属性

另一种实现单例模式的方式是使用对象属性。我们可以在一个对象中定义一个属性,并将其设置为单例实例。

const Singleton = {
  instance: null,
  getInstance: function () {
    if (!this.instance) {
      this.instance = new Object();
    }
    return this.instance;
  },
};

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true

5. 对象方法

除了使用对象属性,我们还可以使用对象方法来实现单例模式。

const Singleton = {
  getInstance: function () {
    if (!this._instance) {
      this._instance = new Object();
    }
    return this._instance;
  },
};

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true

6. ES6 类

在 ES6 中,我们可以使用 class 来实现单例模式。

class Singleton {
  static getInstance() {
    if (!this._instance) {
      this._instance = new Singleton();
    }
    return this._instance;
  }
}

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true

结语

单例模式是 JavaScript 中一个非常重要的设计模式,它在许多场景中都有着广泛的应用。通过本文,您已经学习了六种实现单例模式的方法,希望对您有所帮助。