前端常见的设计模式之【单例模式】
前端常见的设计模式:
- 单例模式
- 观察者模式
- 工厂模式
- 适配器模式
- 装饰器模式
- 命令模式
- 迭代器模式
- 组合模式
- 策略模式
- 发布订阅模式
单例模式【创建型设计模式】:
- 单例模式是确保一个类只有一个实例,并提供一个全局访问点。
- 这个模式非常适合那些需要共享资源的场景。常用于全局状态管理、全局配置对象,如Redux或Vuex的store,或者全局的弹窗、日志服务等。
类是什么?
- 类是面向对象编程中的一个基本概念,它是对具有相同属性和方法的一组对象的抽象描述。
- 类定义了对象的属性(数据)和行为(方法或函数)。
- ES6之后,JavaScript引入了**
class 关键字**,使得类的定义更加直观和简洁。
实例是什么?
- 实例是根据类创建的具体对象。
- 每个实例都有自己的属性值和可以调用的方法,但它们共享类定义的行为和结构。
类中有很多实例的代码示例:
class NonSingleton {constructor(name) {this.name = name;}
}const obj1 = new NonSingleton('Alice');
const obj2 = new NonSingleton('Bob');obj1.name; // 'Alice'
obj2.name; // 'Bob'
// obj1 和 obj2 是两个独立的实例,更改一个不会影响另一个
类中只有一个实例的代码示例(单例模式):
在单例模式中,无论你尝试创建多少次实例,都会得到同一个对象。因此,如果你更改了这个对象的某个属性,所有引用这个对象的地方都会感知到这个更改。
class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}this.name = 'Default Name';Singleton.instance = this;}
}const singleton1 = new Singleton();
const singleton2 = new Singleton();singleton1.name = 'Changed Name';singleton1.name; // 'Changed Name'
singleton2.name; // 也是 'Changed Name',因为它们引用的是同一个实例
class Singleton {constructor(name) {// 如果实例已经存在,则直接返回它,忽略传入的参数if (Singleton.instance) {return Singleton.instance;}// 否则,使用传入的参数初始化实例this.name = name || 'Default Name';// 将当前实例存储为类的静态属性Singleton.instance = this;}// 静态方法用于获取实例(可选)static getInstance(name) {if (!Singleton.instance) {new Singleton(name);}return Singleton.instance;}
}// 首次创建实例并传入参数
const singleton1 = new Singleton('Alice');
console.log(singleton1.name); // 输出: Alice// 尝试再次创建实例,但传入不同的参数
const singleton2 = Singleton.getInstance('Bob');
console.log(singleton2.name); // 输出: Alice,因为实例已经存在,所以参数被忽略// 验证两个引用是否指向同一个实例
console.log(singleton1 === singleton2); // 输出: true
单例模式的实现方式:
- 饿汉式:在类加载时就初始化实例,因此线程安全。优点是实现简单、线程安全;缺点是类加载时就实例化,可能造成资源浪费。
- 懒汉式:在第一次使用时才初始化实例,不是线程安全的,需要加锁。优点是延迟加载、节省资源;缺点是需要加锁、性能较差。
- 双重校验锁:在懒汉式的基础上进行了优化,减少了不必要的同步开销。优点是延迟加载、节省资源、线程安全、性能较高;缺点是代码较复杂。
- 静态内部类:利用静态内部类的特性实现单例模式,线程安全且延迟加载。优点是延迟加载、节省资源、线程安全、利用类加载机制保证初始化时只有一个线程;缺点是代码较简单、易读性好。
- 枚举:利用枚举实现单例模式,天生线程安全,防止反序列化创建新实例。优点是实现简单、防止反射和序列化破坏单例;缺点是不能延迟加载。
Vue单例模式示例:
在Vue中,单例模式通常不是直接应用于Vue组件本身的,因为Vue组件的实例是由Vue框架自己管理的。但是,我们可以在Vue应用中使用单例模式来管理某些全局状态或服务。例如,我们可以创建一个全局的事件总线(Event Bus)或者一个全局的配置管理器。
- 首先,我们定义一个单例模式的配置管理器:
// ConfigManager.js
const ConfigManager = (function() {let instance;// 构造函数,包含一些配置信息function Config() {this.apiKey = 'your-api-key';this.featureFlag = true;// 其他配置...}// 获取单例对象的方法,检查instance变量是否已经被初始化function getInstance() {if (!instance) {instance = new Config();}return instance;}// 公开getInstance方法,其他方法或属性可以根据需要添加return {getInstance: getInstance};
})();export default ConfigManager;
- 接下来,我们在Vue组件中使用这个配置管理器:
// SomeComponent.vue
<template><div>API Key: {{ apiKey }}<button @click="toggleFeature">Toggle Feature Flag</button></div>
</template><script>
import ConfigManager from './ConfigManager';export default {data() {return {apiKey: '',featureFlag: false};},created() {const config = ConfigManager.getInstance();this.apiKey = config.apiKey;this.featureFlag = config.featureFlag;},methods: {toggleFeature() {const config = ConfigManager.getInstance();config.featureFlag = !config.featureFlag;this.featureFlag = config.featureFlag;}}
};
</script>
相关文章:
前端常见的设计模式之【单例模式】
前端常见的设计模式: 单例模式观察者模式工厂模式适配器模式装饰器模式命令模式迭代器模式组合模式策略模式发布订阅模式 单例模式【创建型设计模式】: 单例模式是确保一个类只有一个实例,并提供一个全局访问点。这个模式非常适合那些需要…...
【React】脚手架进阶
目录 暴露webpack配置package.json的变化修改webpack.config.js配置less修改域名、端口号浏览器兼容处理处理跨域 暴露webpack配置 react-scripts对脚手架中的打包命令进行封装,如何暴露这些打包配置呢?上篇写到在package.json中的scripts配置项中有eje…...
win32汇编环境,窗口程序中单选框的一般操作示例
;运行效果 ;win32汇编环境,窗口程序中单选框的一般操作示例 ;比如在窗口程序中生成单选框,默认哪项选中,判断当前选中哪一项,让哪项选中,得到选中项的名称等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>&g…...
如何移除git中被跟踪的commit文件
忽略已被跟踪的文件 问题描述 如果某个文件已经被 Git 跟踪(即已被提交到仓库),即使后来将其添加到 .gitignore 文件中,Git 仍会继续跟踪它。 解决方案 更新 .gitignore 文件 将需要忽略的文件加入 .gitignore: .env…...
结合night compute分析 利用tensor core 优化K值较大的矩阵乘(超过cublas50%)
一 night compute分析 将cublas作为base line和现有的代码分析 图1.1 可以发现计算吞吐量明显偏低,能想到的就是计算单元处于空闲的概率较大,是访存密集型算子,因此可以增大数据的吞吐量,多给计算单元提供数据 二 代码 #include "common.h"//mma计算的基本尺…...
Docker 部署 Typecho
1. 官网 https://typecho.org/插件 & 主题 https://github.com/typecho-fans/plugins https://typechx.com/ https://typecho.work/2. 通过 compose 文件安装 github官网: https://github.com/typecho/Dockerfile 新建一个目录,存放 typecho 的相…...
【大数据】机器学习-----模型的评估方法
一、评估方法 留出法(Holdout Method): 将数据集划分为训练集和测试集两部分,通常按照一定比例(如 70% 训练集,30% 测试集)。训练集用于训练模型,测试集用于评估模型性能。优点&…...
【Excel笔记_3】execl的单元格是#DIV/0!,判断如果是这个,则该单元格等于空
在 Excel 中,可以使用 IF 函数来判断单元格是否是 #DIV/0! 错误,并将其替换为空值(即空字符串 "")。具体公式如下: IF(ISERROR(A1), "", A1)或者,如果只想判断 #DIV/0! 错误ÿ…...
FPGA EDA软件的位流验证
位流验证,对于芯片研发是一个非常重要的测试手段,对于纯软件开发人员,最难理解的就是位流验证。在FPGA芯片研发中,位流验证是在做什么,在哪些阶段需要做位流验证,如何做?都是问题。 我们先整体的…...
信号与系统初识---信号的分类
文章目录 0.引言1.介绍2.信号的分类3.关于周期大小的求解4.实信号和复信号5.奇信号和偶信号6.能量信号和功率信号 0.引言 学习这个自动控制原理一段时间了,但是只写了一篇博客,其实主要是因为最近在打这个华数杯,其次是因为在补这个数学知识…...
信号量机制之苹果-橘子问题
桌上有一空盘,允许存放一种水果。爸爸可向盘中放苹果,也可向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一个水果供吃者取用。 要求:请用信号量机制实现爸爸、儿子、女儿三个并发…...
三相无刷电机控制|FOC理论04 - 克拉克变换 + 帕克变换的最终目标
导言 通过坐标系旋转,将电机中复杂的三相交流信号映射到与转子磁场同步的旋转参考系中,将动态问题转化为静态问题。这种方法的优点在于: 简化了控制逻辑。实现了转矩Iq和磁通Id的解耦。提供了直流量控制的可能性,大大提高了控制效…...
Nacos: 一个动态服务发现与配置管理平台
Nacos: 一个动态服务发现与配置管理平台 引言 在微服务架构日益普及的今天,服务之间的调用和配置管理变得越来越复杂。为了简化这一过程并提高开发效率,阿里巴巴推出了Nacos——一个易于使用的动态服务发现、配置管理和服务管理平台。 Nacos是什么&am…...
认识机器学习中的结构风险最小化准则
上一篇文章我们学习了关于经验风险最小化准则,其核心思想是通过最小化训练数据上的损失函数来优化模型参数,从而提高模型在训练集上的表现。但是这也会导致一个问题,经验风险最小化原则很容易导致模型在训练集上错误率很低,但在未…...
计算机网络 (35)TCP报文段的首部格式
前言 计算机网络中的TCP(传输控制协议)报文段的首部格式是TCP协议的核心组成部分,它包含了控制TCP连接的各种信息和参数。 一、TCP报文段的结构 TCP报文段由首部和数据两部分组成。其中,首部包含了控制TCP连接的各种字段ÿ…...
ubuntu24.04安装docker显卡工具包nvidia-container-toolkit
问题描述 docker 容器启动时如果需要访问 gpu ,需要安装 nvidia-container-toolkit 才行,否则会提示如下错误 sudo docker run --rm -it --gpus all ubuntu:latest docker: Error response from daemon: could not select device driver "" …...
rknn环境搭建之docker篇
目录 1. rknn简介2. 环境搭建2.1 下载 RKNN-Toolkit2 仓库2.2 下载 RKNN Model Zoo 仓库2.3 下载交叉编译器2.4 下载Docker镜像2.5 下载ndk2.5 加载docker镜像2.6 docker run 命令创建并运行 RKNN Toolkit2 容器2.7 安装cmake 3. 模型转换3.1 下载模型3.2 模型转换 4. 编译cdem…...
OpenCV相机标定与3D重建(56)估计物体姿态(即旋转和平移)的函数solvePnPRansac()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用RANSAC方案从3D-2D点对应关系中找到物体的姿态。 cv::solvePnPRansac 是 OpenCV 中用于估计物体姿态(即旋转和平移)的…...
vue倒计时组件封装,根据每个循环项的倒计时是否结束添加新类名。
1.创建countdown.vue文件: <template><p style"font-size: 10px">{{time}}</p> </template> <script>export default{data () {return {time : ,flag : false}},mounted () {let time setInterval(() > {if (this.fla…...
缩放 对内外参的影响
当你对图像进行同比例缩小时,图像的内参需要相应地变化,但外参通常保持不变。 相机内参 相机内参(内参矩阵)描述了相机的固有属性,包括焦距和主点(光轴与图像平面的交点)的坐标。 当你对图像…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析
1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...
