前端开发的单例设计模式

news2024/12/23 7:07:44

一、什么是单例模式

单例模式(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.coloradmin.cn/o/2119401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙开发(API 12 Beta6版)【NFC标签读写】 网络篇

简介 近场通信(Near Field Communication,NFC)是一种短距高频的无线电技术,在13.56MHz频率运行,通信距离一般在10厘米距离内。电子设备可以通过NFC通信技术和NFC标签通信,从标签中读取数据,或写入数据到标签。 NFC标…

XInput手柄输入封装

功能全面地封装了XInput的输入, 1. 普通按钮按下, 按住, 弹起状态检查, 2. 摇杆4个方向的按下, 按住, 弹起检查 3. 按键状态变化检测并且记录按下触发时间, 按住保持时间, 方便用来完全自定义的输入功能 4. 多手柄输入合并 CXinputHelper.h #pragma once #include <win…

微信支付开发避坑指南

1 微信支付的坑 1.1 不能用前端传递过来的金额 订单的商品金额要从数据库获取&#xff0c;前端只传商品 id。 1.2 交易类型trade type字段不要传错 v2版API&#xff0c;不同交易类型&#xff0c;要调用的支付方式也不同。 1.3 二次签名 下单时&#xff0c;在拿到预支付交…

哈希表-数据结构

一、哈希表基本概念 哈希表&#xff08;也称为散列表&#xff09;是根据键而直接访问在内存存储位置的数据结构&#xff0c;也就是说实际上是经过哈希函数进行映射&#xff0c;映射道表中一个位置来访问记录&#xff0c;这个存放记录的数组称为散列表。 哈希函数&#xff1a;就…

计组基础知识

操作系统的特征 并发 共享 虚拟 异步 操作系统的功能 1、资源分配&#xff0c;资源回收 硬件资源 CPU、内存、硬盘、I/O设备。 2、为应⽤程序提供服务 操作系统将硬件资源的操作封装起来&#xff0c;提供相对统⼀的接⼝&#xff08;系统调⽤&#xff09;供开发者调⽤。 3、管…

Redis 集群会有写操作丢失吗?为什么?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis 集群会有写操作丢失吗&#xff1f;为什么&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 集群会有写操作丢失吗&#xff1f;为什么&#xff1f; Redis 并不能保证数据的强一致性&#xff0c;这意味这在…

Qt_概述

目录 1、图形用户界面 2、客户端开发 3、什么是界面 4、Qt的发展史 5、Qt支持的平台 6、Qt的版本 7、Qt的优点 8、Qt的应用场景 小结 前言&#xff1a; Qt是一个应用程序开发框架&#xff0c;他具有跨平台性质&#xff0c;主要使用C语言进行编程&#xff0c;Qt的开发…

透视表支持自定义聚合公式,新增字体管理功能,DataEase开源BI工具v2.10 LTS版本发布

2024年9月9日&#xff0c;人人可用的开源BI工具DataEase正式发布v2.10 LTS&#xff08;Long Term Support&#xff09;版本。DataEase开源项目组将对v2.10 LTS版本提供长期支持&#xff0c;定期迭代发布小版本&#xff0c;持续进行问题修复更新并针对部分功能进行优化。欢迎广大…

数据结构第二周做题总结_顺序表

id:17 A. DS顺序表–类实现 题目描述 用C语言和类实现顺序表 属性包括&#xff1a;数组、实际长度、最大长度&#xff08;设定为1000&#xff09; 操作包括&#xff1a;创建、插入、删除、查找 类定义参考 输入 第1行先输入n表示有n个数据&#xff0c;即n是实际长度&am…

【软件测试】盒木进销存管理系统 需求说明书

目录 1 引言 2 项目概述 3 平台、角色和权限 3.1 Web端 4 Web端需求 4.1 登录/注册页面 4.1.1 业务描述 4.1.2 需求描述 4.1.3 行为人 4.1.4 UI页面 4.1.5 业务规则 4.2 首页 4.2.1 业务描述 4.2.2 需求描述 4.2.3 行为人 4.2.4 UI界面 4.2.5 业务规则 4.3报…

软件测试工程师面试题大全(附答案)

1、什么是兼容性测试? 答&#xff1a;兼容性测试是检查软件在不同软件平台&#xff0c;硬件平台上是否可以正常运行的测试。主要查看软件在不同操作系统、浏览器、数据库中运行是否正常。 2、你能不能说下你3-5年的职业规划? 答&#xff1a;首先&#xff0c;要巩固自己的测…

电脑怎么切换IP地址 手机如何更改ip地址

深度IP转换器是一款专业的网络工具&#xff0c;旨在帮助用户轻松切换IP地址&#xff0c;保护个人隐私和网络安全。以下是使用深度IP转换器切换IP地址的详细步骤&#xff1a; ‌下载与安装‌&#xff1a; 首先&#xff0c;您需要在官方网站或正规下载渠道下载深度IP转换器的最新…

自选择问题和处理效应模型

自选择问题和处理效应模型 DGP 注意&#xff1a; 这里的概率密度超过了1&#xff0c;这是正常的。概率密度的三原则&#xff0c;1是大于等于0&#xff1b;2是积分等于1&#xff1b;对于连续型随机变量&#xff0c;给定一个具体的x值&#xff0c;f(x)并不是该事件发生的概率。而…

感谢关注 Thanks for your attention

后端技术栈 前端技术栈 DevOps 运维技术栈 测试技术栈 开发工具 其他 汇总 一个基于websocket协议的分布式推送服务 ( https://github.com/webVueBlog/springboot-cloud-push )Mall-system-Java-Vue-Uni-app商城JAVA版&#xff0c;SpringBoot Maven Swagger Mybatis Plus R…

yarn create vite时报错error Error: EPERM: operation not permitted, mkdir

在构建项目的前端脚手架时&#xff0c;窗口出现了该错误&#xff0c;搜索了大量解决方案后&#xff0c;以下是我的步骤 &#xff1a; 再cd到我的D盘项目路径位置 再次运行yarn create vite 算了&#xff0c;换npm搞&#xff1a;npm create vitelatest 出现以下报错 我的解…

网络编程day04(UDP、Linux IO 模型)

目录 【1】UDP 1》通信流程 2》函数接口 1> recvfrom 2> sendto 3》代码展示 1> 服务器代码 2> 客户端代码 【2】Linux IO 模型 场景假设一 1》阻塞式IO&#xff1a;最常见、效率低、不耗费CPU 2》 非阻塞 IO&#xff1a;轮询、耗费CPU&#xff0c;可以处…

【C++ 面试 - 新特性】每日 3 题(三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

RPKI应急管控网络拓扑搭建

应急管控网络拓扑搭建 一、网络拓扑图 二、拓扑配置 1.资源库批量导入roas 在rpki.qcl.edu.cn服务器上的/usr/local/rpki/目录下执行脚本 sh roa_get.sh add#!/bin/dash# TODO Aadd Rremove start10000 sum254 run(){for i in seq 1 20dofor j in seq 1 250doas_numberexpr…

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上

文章目录 一、原理分析1.1 对于IMX6ULL的IO初始化1.2 IO的复用&#xff08;MUX&#xff09;1.3 电气属性寄存器&#xff08;PAD&#xff09;1.3.1 SRE(bit0)1.3.2 DSE(bit5:3)1.3.3 SPEED(bit7:6)1.3.4 ODE(bit11)1.3.5 PKE(bit12)1.3.6 PUE(bit13)1.3.7 PUS(bit15:14)1.3.8 HY…

6.5椒盐噪声

在OpenCV中联合C给一张图片加上椒盐噪声&#xff08;Salt and Pepper Noise&#xff09;可以通过随机选择像素点并将其置为黑色&#xff08;0&#xff09;或白色&#xff08;255&#xff09;来实现。椒盐噪声是一种随机噪声&#xff0c;通常表现为图像中的孤立黑点&#xff08;…