前端开发的单例设计模式

news/2024/9/18 12:31:43/ 标签: 设计模式

一、什么是单例模式

单例模式(Singleton Pattern)是一种常见的设计模式,它确保在整个应用程序的生命周期中,一个类只能创建一个实例。无论你在代码的任何地方尝试创建该类的新实例,它都会返回已经存在的唯一实例。这在需要共享资源、全局状态、缓存、数据库连接等场景非常有用。

单例模式的优点:

  1. 节省资源:因为单例对象只会被创建一次,避免了不必要的资源浪费。
  2. 全局访问:提供了一个全局访问点,所有对该类的操作都通过同一个实例完成。
  3. 控制实例数量:在某些场景下,我们只需要一个对象来管理状态、处理逻辑,单例模式提供了这种机制。

单例模式的缺点:

  1. 全局状态可能导致难以调试:由于状态被共享,容易在多个地方发生状态冲突。
  2. 违背面向对象的原则:单例模式引入了全局状态,破坏了面向对象的封装性。

二、TypeScript 实现单例模式

我们可以通过 TypeScript 来实现单例模式。TypeScript 是一种强类型的 JavaScript 超集,借助 TypeScript 的静态类型检查和面向对象特性,我们可以更好地实现和管理单例模式。

实现代码:

class Singleton {// 定义一个私有的静态变量,来保存类的唯一实例private static instance: Singleton;// 私有化构造函数,防止外部实例化private constructor() {console.log('Singleton instance created!');}// 提供一个静态方法,用于获取类的唯一实例public static getInstance(): Singleton {if (!Singleton.instance) {Singleton.instance = new Singleton();}return Singleton.instance;}// 一个简单的方法来测试单例功能public showMessage(): void {console.log('Hello from Singleton!');}
}// 测试单例模式
const singleton1 = Singleton.getInstance();
const singleton2 = Singleton.getInstance();// 输出:true,说明两个实例是相同的
console.log(singleton1 === singleton2);// 调用 showMessage 方法
singleton1.showMessage();

代码解析:

  1. 私有构造函数:通过将构造函数声明为 private,我们防止了该类可以在外部直接通过 new 进行实例化。
  2. 静态方法 getInstance:通过一个静态方法 getInstance,我们可以确保类的实例只有一个。如果实例还未被创建,则创建新的实例;如果已经存在,则返回该实例。
  3. 静态变量 instance:用来存储该类的唯一实例。

通过上述代码可以确保在任何地方调用 Singleton.getInstance() 时,返回的都是同一个对象实例。

三、PlantUML 示例

为了更好地理解单例模式的结构,下面我们使用 PlantUML 来表示单例模式的类图。

@startuml
class Singleton {- instance : Singleton- Singleton()+ getInstance() : Singleton+ showMessage() : void
}Singleton -- Singleton : use
@enduml

解释:

  1. Singleton 类:该类有一个私有的静态成员 instance 来保存唯一实例,同时还有一个私有的构造函数和一个公共的 getInstance() 方法用于获取该实例。
  2. getInstance() 方法:负责检查实例是否存在,不存在则创建,存在则返回已有实例。

四、总结

单例模式在某些场景下非常有用,特别是当我们需要确保某个类只有一个实例时。通过 TypeScript 实现单例模式,我们可以利用面向对象的特性来确保类的唯一实例。此外,PlantUML 的类图帮助我们更好地理解单例模式的设计结构。


http://www.ppmy.cn/news/1524723.html

相关文章

计算机网络分层结构解析:OSI与TCP/IP模型

文章目录 计算机网络分层结构解析:OSI与TCP/IP模型一、引言二、OSI七层模型1、模型介绍1.1、层次功能 2、模型特点 三、TCP/IP四层模型1、模型介绍1.1、层次功能 2、模型特点 四、总结 计算机网络分层结构解析:OSI与TCP/IP模型 一、引言 计算机网络的分…

【前端UI框架】VUE ElementUI 离线文档 可不联网打开

【前端UI框架】VUE ElementUI 离线文档 可不联网打开 Element - The worlds most popular Vue UI framework Element - The worlds most popular Vue UI framework 离线文档下载地址 https://download.csdn.net/download/G971005287W/89742895 文档制作 第一步: 克隆源代码 …

oceanbase(ob)基于备份集搭建备租户方式

一、搭建备租户方式(基于备份的方式) 注意事项:要有一个源端OB集群和目标端OB集群。 1、新建主租户(如果原来有主租户可是省略) #创建unit create resource unit ut_2c2g max_cpu2, memory_size2G, max_iops10000,l…

网络安全实训七(MSF与CS互相连接)

1 MSF连接CS 1.1 生成木马上传到/var/www/html中 1.2 开启apache服务 1.3 设置监听模组并运行 1.4 在靶机上打开网页运行木马 1.5 kali机中获取反弹的shell 1.6 运行CS服务器 1.7 windows端作为客户端连接CS 1.8 新建一个监听器 1.9 返回kali机中使用载荷注入模块,…

【Linux网络】详解TCP协议(1)

🎉博主首页: 有趣的中国人 🎉专栏首页: Linux网络 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 TCP协议 的相关内容。 如果看到最后您觉得这篇文章写得不错&am…

前端开发的观察者模式

什么是观察者设计模式 观察者模式(Observer Pattern)是前端开发中常用的一种设计模式。它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,其所有依赖对象都能收到通知并自动更新。观察者模式广泛应用于事件驱动的系…

如何在 Visual Studio Code 中反编译具有正确行号的 Java 类?

优质博文:IT-BLOG-CN 问题 我在 macOS 中使用 vscode 版本 1.92.2,并安装了Java 扩展包v0.29.0。当我打开command click或right click->Go to definition一个没有源代码的类时,vscode 会使用 FernFlower 反编译器打开 .class 文件。但…

python-古籍翻译

题目描述 小理跑到外星人的图书馆去读书。有一本外星古籍,里面的内容是用八进制写成的;但小理只能处理十六进制的数据。请你帮忙写一个翻译软件,帮小理把八进制串翻译成十六进制串。 输入 仅一行,一个八进制字符串 s&#xff0…

Linux下进程间的通信--信号量

前言: 资源竞争: 资源竞争(Race Condition)是多线程或多进程环境中的一种常见问题,它发生在多个进程或线程并发访问和修改同一资源(如内存位置、文件、数据库记录等)时,而最终结果…

Aloudata AIR :国内首个 Data Fabric 逻辑数据平台

AIR 的寓意是“极致轻盈的数据交付”:A - Adaptive 自适应,I - Integration 集成,R - Resilience 弹性 News:Aloudata AIR 发布 作为国内首个 Data Fabric 逻辑数据平台,Aloudata AIR 通过自研的数据虚拟化技术&#…

中秋限定 | AI创意数字月饼(附关键词)

中秋节快到啦,给大家分享一波透明的数字月饼设计 这样的月饼可以永久保存,再也不用担心浪费了啦 AI绘画工具:https://qianlu.cc/?sEmGaur . 核心关键词: Chinese mooncakes (中式月饼) gradient transluc…

【hot100】力扣hot100部分题解

1.和为k的子数组 题目链接 注意:题目是连续的子数组。 因为数据有负数,用滑动窗口不太好做。 所以用数组前缀和。 数组前缀和就是从第1位到当前位的子数组的和。 每次遍历更新到当前位之前的前缀和,以对象的形式存储(key为前缀和&…

力扣100题——动态规划

爬楼梯 题目 70. 爬楼梯 - 力扣(LeetCode) 思路 动态规划关键在于写出状态转移方程,根据题目的意思每次能上一个台阶或两个台阶 用dp数组,dp[i]代表上到第i个台阶最多有几种的方法那么很容易就可以推出 dp[i]dp[i-1]dp[i-2]对…

# 执行 DISM 命令时出错 87 未在此上下文中识别出 restorehealth 选项。解决方法

执行 DISM 命令时出错 87 未在此上下文中识别出 restorehealth 选项。解决方法 一、错误描述: C:\Users\Administrator>DISM.exe /Online /Cleanup-image /Restorehealth部署映像服务和管理工具 版本: 6.1.7601.24499映像版本: 6.1.7601.24499错误: 87未在此上下…

【区块链 + 基层治理】链动社区:基于 FISCO BCOS 的智慧社区数字化治理平台 | FISCO BCOS应用案例

“链动社区——基于 FISCO BCOS 的智慧社区数字化治理平台”是智慧社区治理服务一套完整系统,通过使用 FISCO BCOS 联盟链方案进行社区数据管理(积分交易数据和行为数据等)、对社区工作进行数字化支持,激发社区治理的多元主体参与…

前后端时间转换的那些常见问题及处理方法

在现代的Web开发中,前后端分离的架构已经成为主流,尤其是在Spring Boot和Vue.js的组合中。开发者在这种架构下经常遇到的一个问题就是如何处理时间的转换和显示。前端和后端对时间的处理方式不同,可能会导致时间在传递过程中出现问题&#xf…

【C++】C++11-右值引用和移动语义

目录 1、左值与右值 2、左值引用与右值引用 3、左值引用和右值引用的底层 4、左值引用的不足 5、移动构造 6、移动赋值运算符重载 7、插入操作 8、完美转发 传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们之前…

AI性能评估工具 | 安兔兔AI大模型评测 v1.0.0.1095

安兔兔AI大模型评测是一款性能评估软件,专注于对设备在CPU、GPU及专属AI加速器上的AI处理能力进行全方位测试与评估。该软件精确评估设备的AI计算能力,助力用户深入理解设备在执行AI任务时的表现。 借助评测数据,用户能够清晰地掌握设备的AI…

Leetcode 第 138 场双周赛题解

Leetcode 第 138 场双周赛题解 Leetcode 第 138 场双周赛题解题目1:3270. 求出数字答案思路代码复杂度分析 题目2:3271. 哈希分割字符串思路代码复杂度分析 题目3:3272. 统计好整数的数目思路代码复杂度分析 题目4:3273. 对 Bob 造…

通过TensorBoard查看服务器训练过程

步骤 1: 启动服务器上的 TensorBoard 在服务器上&#xff0c;启动 TensorBoard 并指定一个端口&#xff08;例如 6006&#xff09;&#xff1a; tensorboard --logdir <日志文件路径> --port 6006这里 <日志文件路径> 是你存放训练日志的目录。 步骤 2: 使用 SS…