当前位置: 首页 > news >正文

前端开发的单例设计模式

一、什么是单例模式

单例模式(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 的类图帮助我们更好地理解单例模式的设计结构。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 内网穿透的应用-Deepin系统安装x11vnc实现任意设备无公网IP远程连接Deepin桌面
  • ITK-高斯滤波
  • 【数据结构与算法】——学习笔记
  • liunx io模型多路复用
  • 2024年【甘肃省安全员C证】报名考试及甘肃省安全员C证考试总结
  • MyBatis详解
  • ios签名怎么找靠谱的服务商
  • 睿考网:中级经济师考试题型有哪些?
  • 小米嵌入式面试题目RTOS面试题目 嵌入式面试题目
  • 【QT Creator】基本使用
  • 2025通信硕士找工作纪实
  • Scratch中秋节——嫦娥奔月
  • 如何从0到1本地搭建whisper语音识别模型
  • OpenHarmony鸿蒙开发( Beta5.0)无感配网详解
  • 「大数据分析」Pandas图形可视化,基本绘图:折线图及实践
  • php的引用
  • 4. 路由到控制器 - Laravel从零开始教程
  • input实现文字超出省略号功能
  • JavaScript函数式编程(一)
  • java正则表式的使用
  • JS基础之数据类型、对象、原型、原型链、继承
  • Laravel核心解读--Facades
  • PAT A1092
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python语法速览与机器学习开发环境搭建
  • SwizzleMethod 黑魔法
  • 将回调地狱按在地上摩擦的Promise
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 小程序button引导用户授权
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 用jquery写贪吃蛇
  • 字符串匹配基础上
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • mysql面试题分组并合并列
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (6)添加vue-cookie
  • (7)svelte 教程: Props(属性)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (windows2012共享文件夹和防火墙设置
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (备忘)Java Map 遍历
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (离散数学)逻辑连接词
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • .chm格式文件如何阅读
  • .gitignore文件---让git自动忽略指定文件
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net和jar包windows服务部署
  • .sh
  • // an array of int
  • /proc/interrupts 和 /proc/stat 查看中断的情况