JS设计模式之单例原型

各位老铁们,今天我们介绍一下JS中单例设计模式,它的特点是确保一个类只有一个实例,并提供一个全局访问点来获取该实例(无论被创建或实例多少次)。接一下从不同角度来实现各场景下的创建过程;

那么单例模式都有哪些应用场景呢?

下面列出常用的几个方面

  • 全局状态管理:例如 Redux 中的 Store。
  • 配置对象:确保配置对象在整个应用中只有一个实例。
  • 数据库连接池:避免重复创建数据库连接。
  • 日志记录器:确保日志记录器是唯一的。

如何通过构造函数创建单例

通过判断instance这个变量是否存在,如果存在或非undefind则返回实例对象,否则将当前类实例的this重新指向instance

javascript 复制代码
class Singleton01 {
        constructor() {
                if (Singleton01.instance) {
                        return Singleton01.instance;
                }
                Singleton01.instance = this;
        }
}

那么实例创建好了,我们通过什么方式来获取呢,可以通过定义一个static静态方法来获取这个实例,这样即能实例唯一性问题;

javascript 复制代码
//这个非常简单即当instance不存在时重新new一个class对象给它,如果存在则直接返回class这个类的instance变量出去即可;
static getInstance() {
        if (!Singleton01.instance) {
                Singleton01.instance = new Singleton01();
        }
        return Singleton01.instance;
}

接下来通过实际示例演示一下,利用constructor创建单例和new出来的对象,以及多次创建是否一致;

javascript 复制代码
let instance1 = Singleton01.getInstance();
let instance2 = Singleton01.getInstance();
let instance3 = new Singleton01();

console.log('instance1 === instance2:',instance1 === instance2); //返回true
console.log('instance1 === instance3:',instance1 === instance3); //返回true

//可以看出两种结果其实构建出来的对象完全一致,指针最终都会指向一个对象

如何使用模块化的方式创建

  1. 先在全局定义用于接收实例的变量
javascript 复制代码
let instance;
  1. 然后在构造函数中为上面全局变量进行当前实例赋值
javascript 复制代码
let instance02;
//如果不是vue项目那么export default关键字可以不设置,其下面的导入方式也可以改为文件导入方式
export default class Singleton02 {
        constructor() {
                if (instance02) {
                        return instance02;
                }
                instance02 = this;
        }
}
  1. 最后通过导入类来实例,这样创建出来的最终都会指向全局变量instance
javascript 复制代码
import Singleton from 'pattern/singleton_02.js'

let instance4 = new Singleton();
let instance5 = new Singleton();
console.log('instance4 === instance5:', instance4 === instance5); //返回true

总结

单例模式的核心是确保一个类只有一个实例,可以通过构造函数、静态方法、闭包或模块化等方式实现。一般适用于需要全局唯一或单一对象的情况下使用;

相关推荐
月月大王的3D日记几秒前
Three.js 入门系列(9):从零搭一座“闹鬼小屋”
前端·javascript
2601_966949656 分钟前
实时行情中的成交量 Volume 到底是什么?包含盘中撤单量吗?从交易数据语义到 QuantDash 实战解析
开发语言·人工智能·python·量化·quantdash·量化数据源
开开心心就好39 分钟前
电子教鞭工具支持画框写字插图片功能齐全
android·开发语言·前端·javascript·人工智能·pdf·html
Dovis(誓平步青云)1 小时前
拍视频前先把镜头想清楚:做一个分镜取景辅助器
android·java·服务器·javascript·人工智能
AI人工智能+电脑小能手1 小时前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc
zx_741484811 小时前
【Python入门】爬虫实战:Requests + XPath 从基础到实战
开发语言·爬虫·python
吴声子夜歌1 小时前
Java——开发中通用的方法和准则(二)
java·开发语言·php
江屿风1 小时前
C++OJ题经验总结(竞赛)5
开发语言·c++
溪语流沙1 小时前
【Python项目实战】虚拟环境与依赖管理:venv / pip / requirements.txt实操
开发语言·python·pip
神威难绷泪1 小时前
Linux应用软件编程:线程分离属性 互斥机制 同步机制 死锁
linux·开发语言·算法·线程