前端开发的单例设计模式

一、什么是单例模式

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/873933.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【通信管理之c++基础01】std::future

std::future https://en.cppreference.com/w/cpp/thread/future https://cplusplus.com/reference/future/future/ std::async #

【C++】C++入门基础,详细介绍命名空间,缺省参数,函数重载,引用,内联函数等

目录 1. 命名空间 1.1 使用命名空间的目的 1.2 命名空间定义 1.3 命名空间使用 2. 缺省参数 2.1 缺省参数概念 2.2 缺省参数分类 2.3 实际案例 2.4 注意事项 3. 函数重载 3.1 函数重载概念 3.2 函数重载原理 4. 引用 4.1 引用的概念 4.2 引用的特性 4.3 使用…

(计算机网络)运输层

一.运输层的作用 运输层:负责将数据统一的交给网络层 实质:进程在通信 TCP(有反馈)UDP(无反馈) 二.复用和分用 三. TCP和UDP的特点和区别 进程号--不是固定的 端口号固定--mysql--3306 端口--通信的终点 …

【重学 MySQL】十二、SQL 语言的规则与规范

【重学 MySQL】十二、SQL 语言的规则与规范 基本规则注释语法规则命名规则基本命名规则具体命名规范其他注意事项 数据导入指令 SQL(Structured Query Language,结构化查询语言)的规则与规范是确保SQL语句能够正确执行、提高代码可读性和可维…

数据结构C //线性表ADT结构及相关函数

数据结构(C语言版)严蔚敏 吴伟民 线性表ADT结构及相关函数 环境:Linux Ubuntu(云服务器) 工具:vim 代码块(头文件,函数文件,主文件) list.h头文件 /****…

11大排序的原理讲解和Python源码剖析

排序算法 【谁教你这么剪的 | 11大排序的原理讲解和Python源码剖析】 https://www.bilibili.com/video/BV1Zs4y1X7mN/?share_sourcecopy_web&vd_sourceed4a51d52f6e5c9a2cb7def6fa64ad6a 稳定:如果a原本在b前面,而ab,排序之后a仍然在b…

金士顿NV2 2TB假固态硬盘抢救记,RL6577/RTS5765DL量产工具,RTS5765DL+B47R扩容开卡修复

之前因为很长时间不买固态硬盘,没注意到NVME的固态盘也有了假货和扩容盘,花200多块买了个2TB的金士顿NV2固态硬盘,我原本以为NV1的假货最多是用黑片冒充正片,结果没想到NV2居然有扩容的。后来发现是扩容盘的时候,已经过…

亿发进销存一体化解决方案:数据互联互通,优化企业全局管理-下

亿发软件凭借对产品、市场、业务的深入理解,在进销存基础上进行了延伸,推出多终端、一体化的“进销存管理系统”多元产品矩阵。在技术上实现电脑端、手机端、PDA端、零售端、商家版以及小程序商城的多终端无缝对接,保障企业业务的连贯性和效率…

Win10安装.net FrameWork3.5失败解决方法

win10安装.net FrameWork3.5失败解决方法 已经好久没有来投稿了,实在最近业务缠身,忙的焦头烂额(呵~多么伟大的牛马) 但最近开发使用windows11实在是拉胯的不行,升级完就后悔,所以就一怒之下,重装了win10 可是,好家伙,我重装完遇到一个问题,就是在使用.Net Framework3.5,按照Mi…

Zynq7020 SDK 初学篇(4)- PL 端 GPIO

1.开发背景 基于 PS 端 GPIO 的基础上,如何调用 PL 端 GPIO 的输入输出 2.开发需求 PL 端按键控制 PL 端 LED 3.开发环境 Zynq7020 Vivado2017.4 4.实现步骤 4.1 设计配置 这里设置 PIO 数量 3 个 由于 PL 端不像 PS 端一样绑定 GPIO,所以需要对上面…

C++:拷贝构造函数、赋值运算符重载

目录 一、拷贝构造函数 拷贝构造的特点 二、赋值运算符重载 2.1 运算符重载 2.2 赋值运算符重载 赋值运算符重载的特点 一、拷贝构造函数 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造…

【Python篇】matplotlib超详细教程-由入门到精通(上篇)

文章目录 第一部分:基础概念与简单绘图1.1 matplotlib 简介1.2 创建第一个折线图1.3 图表的基本组成元素 第二部分:图表样式与修饰2.1 修改图表样式2.2 添加图例2.3 调整坐标轴与刻度 第三部分:绘制不同类型的图表3.1 散点图 (Scatter Plot)3…

JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看

一 jvm的内存模型 2.1 jvm内存模型概览 二 实操案例 2.1 设置和查看栈大小 1.代码 /*** 演示栈中的异常:StackOverflowError** author shkstart* create 2020 下午 9:08** 设置栈的大小: -Xss (-XX:ThreadStackSize)** -XX:PrintFlagsFinal*/ public class S…

关于ansible自动化运维工具

成长路上不孤单😊【14后,C爱好者,持续分享所学,如有需要欢迎收藏转发😊😊😊😊😊😊😊!!!!&#xff…

Android SystemUI组件(05)状态栏-系统状态图标显示管理

该系列文章总纲链接:专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明: 说明:本章节持续迭代之前章节的思维导图,主要关注下方 SystemBars分析中状态栏中的部分-系统状态图标显示&管理 即可。 1 系统状态图标显…

Error when attempting to add data source to Azure OpenAI api

题意:尝试向 Azure OpenAI API 添加数据源时出现错误 问题背景: My code is working for a call to Azure OpenAI when I dont have a datasource added. However, when I do add my datasource with the following parameters I get an error: 当我没…

Dubbo精要

1、为什么需要 Dubbo? 分布式系统中的服务调用和协调问题:在分布式系统中,服务之间的相互依赖会导致复杂的通信和协调问题。Dubbo提供了高效的服务调用和自动注册、发现等功能,使得构建分布式应用程序更加容易。服务治理和服务调…

LeetCode 热题 100 回顾5

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

CentOS Stream 8中安装和使用 Docker

docker安装包-CSDN博客 〇、常用的docker命令 docker的作用: 快速进行软件的安装,便于软件环境的维护 docker的镜像: 压缩了指定软件的安装包的文件。使用镜像文件创建容器 docker的容器: 容器可以理解为就是一台小电脑。安装的linux系统&am…

C++入门基础篇

引言 说到编程语言常常听到的就是C语言C Java 。C语言是面向过程的,C是和Java是面向对象的,那么什么是面向对象呢?什么又是面向过程呢?C是什么?封装、继承、多态是什么?且听我絮絮叨叨。 C入门基础 1.命名…