JavaScript - 单例模式的几种简单实现方式

1. 什么是单例模式

单例模式的定义是:在任何时候,一个类只能有一个实例,并提供一个访问它的全局访问点

即便多次创建,所得到的实例也和第一次创建的实例相等。

2. 单例模式示例

在JS中实现单例模式的方式有很多。得益于JS的灵活性,可以不需要显式的定义一个类,就可以实现单例。

比如直接通过使用let或const创建全局变量的方式来实例化一个对象。

又或者是通过闭包来实现单例,通过闭包实现单例的方式,感觉也比较符合函数式编程的风格。

通过定义对象字面量的方式来创建一个单例

arduino 复制代码
const singleton = {
  name: 'xxx',
  age: 18
}

通过闭包实现单例模式

ini 复制代码
//定义一个封装了一些方法的函数,比如useXXX之类的
const singleton = () => {
  return {
   name: '张三',
   age: 18
  }
}

//定义一个全局访问的闭包
const getInstance = (() => {
  let instance = null;
  return () => {
   if(!instance) {
    instance = singleton();
   }
   return instance;
  }
})();

const singleton1 = getInstance();
const singleton2 = getInstance();
//不在同一块内存中的对象严格相等的结果是false。这里打印 true,说明成功了
console.log(singleton1 === singleton2);

同样的,JS也能够和其它语言一样,定义一个类来实现单例

使用构造函数实现单例模式

ini 复制代码
class SingletonDemo {
  //创建一个静态属性,它只属于类本身,而不属于实例
  static instance = null;
  constructor() {
   //将首次创建的实例保存在静态属性instance中
   if(!SingletonDemo.instance) {
    SingletonDemo.instance = this;
   }
   return SingletonDemo.instance;
  }
}

const singleton1 = new SingletonDemo();
const singleton2 = new SingletonDemo();
//打印 true
console.log(singleton1 === singleton2);

使用静态方法实现单例模式

ini 复制代码
class SingletonDemo {
  //创建一个静态方法充当全局访问点
  static getInstance() {
   if(!SingletonDemo.instance) {
    //动态创建了一个静态属性instance
    SingletonDemo.instance = new SingletonDemo();
   }
   return SingletonDemo.instance;
  }
}
const singleton1 = SingletonDemo.getInstance();
const singleton2 = SingletonDemo.getInstance();
//打印 true
console.log(singleton1 === singleton2);
相关推荐
七月丶3 小时前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞3 小时前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼3 小时前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟20 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder20 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室1 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃5 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式