JS中实现单例设计模式

软件工程中,设计模式非常常见,最简单,最被问到的单例设计模式,在JS中如何实现呢?

单例设计模式:单例设计模式(Singleton Pattern)确保一个类只有一个实例,并提供一个访问它的全局访问点。
单例模式的主要目的是节约系统资源,对资源进行控制。由于单例模式只生成一个对象,减少了系统开销,对一些需要频繁创建和销毁的对象具有很好的优化作用,如线程池、缓存。也能避免对一些用作工具类使用的对象的重复创建。

在 JS 中,可以通过以下几种方式实现单例模式:

  1. 对象字面量,利用对象字面量创建唯一的对象实例:
let singleton = {
  name: 'singleton',
  method() {
    console.log(this.name); 
  }
};
  1. 通过工厂方法返回对象,检查对象是否已经实例化,如果是则返回已有实例,否则创建一个新实例。
let singleton = (function() {
  let instance;
  function createInstance() {
    let object = new Object({
      name: 'singleton',
      method() {
        console.log(this.name);  
      }
    });
    return object;
  }
  return {
    getInstance() {
      if (!instance) {
        instance = createInstance();  
      }
      return instance;
    }
  }
})(); 
  1. 构造函数,可以通过一个变量来存储对象实例,并在构造函数中检查该变量,来决定是否需要创建新实例。
let Singleton = (function() {
  let instance;
  function Singleton() {
    if (instance) return instance;
    instance = this;
  }
  Singleton.prototype.method = function() { 
    console.log('singleton method');  
  };
  return Singleton;
})();

var s1 = new Singleton(); 
var s2 = new Singleton(); 
s1.method(); 
  1. ES6 中的 Symbol,利用 ES6 中的 Symbol 可以保证实例的唯一性。
let singletonSymbol = Symbol();

let Singleton = (function() {
  let instance;
  
  class Singleton {
    constructor() {
      if (instance) return instance;
      instance = this;
    }
    method() {
      console.log('singleton method');
    }
  }
  
  Singleton[singletonSymbol] = new Singleton(); 
  Object.freeze(Singleton);
    
  return Singleton;
})();

let s1 = Singleton[singletonSymbol];
let s2 = Singleton[singletonSymbol];
s1.method(); 

有很多种方法可以实现 JavaScript 中的单例模式。具体如何使用,取决于需求场景和实现难易度。

你可能感兴趣的:(javascript,设计模式,开发语言)