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 中的单例模式。具体如何使用,取决于需求场景和实现难易度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QB哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值