前端常见的设计模式之【单例模式】

news2025/1/16 3:07:37

前端常见的设计模式:

  1. 单例模式
  2. 观察者模式
  3. 工厂模式
  4. 适配器模式
  5. 装饰器模式
  6. 命令模式
  7. 迭代器模式
  8. 组合模式
  9. 策略模式
  10. 发布订阅模式

单例模式【创建型设计模式】:

  • 单例模式是确保一个类只有一个实例,并提供一个全局访问点
  • 这个模式非常适合那些需要共享资源的场景。常用于全局状态管理、全局配置对象,如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

单例模式的实现方式:

  1. 饿汉式‌:在类加载时就初始化实例,因此线程安全。优点是实现简单、线程安全;缺点是类加载时就实例化,可能造成资源浪费。
  2. 懒汉式‌:在第一次使用时才初始化实例,不是线程安全的,需要加锁。优点是延迟加载、节省资源;缺点是需要加锁、性能较差。
  3. 双重校验锁‌:在懒汉式的基础上进行了优化,减少了不必要的同步开销。优点是延迟加载、节省资源、线程安全、性能较高;缺点是代码较复杂。
  4. 静态内部类‌:利用静态内部类的特性实现单例模式,线程安全且延迟加载。优点是延迟加载、节省资源、线程安全、利用类加载机制保证初始化时只有一个线程;缺点是代码较简单、易读性好。‌
  5. 枚举‌:利用枚举实现单例模式,天生线程安全,防止反序列化创建新实例。优点是实现简单、防止反射和序列化破坏单例;缺点是不能延迟加载。

Vue单例模式示例:

在Vue中,单例模式通常不是直接应用于Vue组件本身的,因为Vue组件的实例是由Vue框架自己管理的。但是,我们可以在Vue应用中使用单例模式来管理某些全局状态或服务。例如,我们可以创建一个全局的事件总线(Event Bus)或者一个全局的配置管理器。

  1. 首先,我们定义一个单例模式的配置管理器:
// 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;
  1. 接下来,我们在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>

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

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

相关文章

欧拉路径算法

欧拉图&#xff1a; 对于应该连通图G&#xff0c;有&#xff1a; 1欧拉路径&#xff1a;一条路径&#xff0c;它能够不重复地遍历完所有的边&#xff0c;这个性质很像不重复地一笔画完所有边&#xff0c;所以有些涉及到欧拉路径的问题叫做一笔画问题。 2欧拉回路&#xff1a…

【进程与线程】程序和进程在内存中的表现

在计算机系统中&#xff0c;程序和进程是两个密切相关但又有本质区别的概念&#xff0c;尤其在内存中的表现上有显著不同&#xff1a; 在这张图中可以直观地看出程序和进程在内存中的结构区别。 基本定义 程序 程序 是一个 静态实体&#xff0c;表示一组写好的指令和数据的…

“多维像素”多模态雷视融合技术构建自动驾驶超级感知能力|上海昱感微电子创始人蒋宏GADS演讲预告

2025年1月14日&#xff0c;第四届全球自动驾驶峰会将在北京中关村国家自主创新示范区展示交易中心-会议中心举行。经过三年的发展&#xff0c;全球自动驾驶峰会已经成长为国内自动驾驶领域最具影响力、规模最大的产业峰会之一。昱感微电子创始人&CEO受到主办方邀请&#xf…

Linux创建server服务器实现多方信息收发

一&#xff0c;服务端 1.创建socket套接字&#xff0c;用于网络通信&#xff0c;同一台机器上的进程也可以通过本地套接字进行通信 //1.socket s_fd socket(AF_INET,SOCK_STREAM,0); if(s_fd -1){ perror("socket"); exit(-1); } //server address s_addr.sin_fami…

UML系列之Rational Rose笔记七:状态图

一、新建状态图 依旧是新建statechart diagram&#xff1b; 二、工作台介绍 接着就是一个状态的开始&#xff1a;开始黑点依旧可以从左边进行拖动放置&#xff1a; 这就是状态的开始&#xff0c;和活动图泳道图是一样的&#xff1b;只能有一个开始&#xff0c;但是可以有多个…

jsx语法中el-table-v2中cellRender如何使用动态绑定

答案&#xff1a;:attribute"xx"改为attribute{xx} 改写&#xff1a; const columns ref([{ key: index, dataKey: index, title: t(setting.index), width: 100 },{ key: no, dataKey: no, title: t(setting.key), width: 100 },{ key: name, dataKey: name, tit…

【初识扫盲】厚尾分布

厚尾分布&#xff08;Fat-tailed distribution&#xff09;是一种概率分布&#xff0c;其尾部比正态分布更“厚”&#xff0c;即尾部的概率密度更大&#xff0c;极端值出现的概率更高。 一、厚尾分布的特征 尾部概率大 在正态分布中&#xff0c;极端值&#xff08;如距离均值很…

EFK采集k8s日志

在 Kubernetes 集群中&#xff0c;需要全面了解各个 pod 应用运行状态、故障排查和性能分析。但由于 Pod 是动态创建和销毁的&#xff0c;其日志分散且存储不持久&#xff0c;因此需要通过集中式日志采集方案&#xff0c;将日志收集到统一的平台并配置日志可视化分析和监控告警…

HTML5教程(中)

HTML5 浏览器支持 HTML5 浏览器支持 目前市面上的浏览器有很多版本&#xff0c;你可以让一些较早的浏览器&#xff08;不支持HTML5&#xff09;支持 HTML5。 HTML5 浏览器支持 现代的浏览器都支持 HTML5。 此外&#xff0c;所有浏览器&#xff0c;包括旧的和最新的&#xff…

OpenCV实现彩色图像的直方图均衡化

1、直方图均衡化 在OpenCV中&#xff0c;equalizeHist函数用于直方图均衡化&#xff08;Histogram Equalization&#xff09;。这是一种图像处理技术&#xff0c;旨在增强图像的对比度&#xff0c;特别是在图像的灰度值集中于某个范围时非常有用。通过调整图像的灰度分布&…

速通nvm安装配置全程无废话

速通nvm安装配置全程无废话 1、安装包 通过网盘分享的文件&#xff1a;nvm-setup-1.1.11.zip等2个文件 链接: https://pan.baidu.com/s/1nk7pAFhhnHXDIIYRJLFqNw 提取码: niw8 --来自百度网盘超级会员v3的分享2、下载安装 nvm安装路径&#xff1a;D:\dev\nvm nodejs路径&am…

JUC Java并发编程 高级 学习大纲 动员

目录 口诀 锁 阿里巴巴开发规范 字节面试题 面试题 1 面试题 2 鼓舞 口诀 高内聚低耦合前提下 封装思想 线程 -- 操作 -- 资源类 判断、干活、通知防止虚假唤醒 &#xff0c;wait 方法要注意注意标志位 flag 可能是 volatile 的 锁 阿里巴巴开发规范 参考书 并发编程…

Unity 3D游戏开发从入门进阶到高级

本文精心整理了Unity3D游戏开发相关的学习资料&#xff0c;涵盖入门、进阶、性能优化、面试和书籍等多个维度&#xff0c;旨在为Unity开发者提供全方位、高含金量的学习指南.欢迎收藏。 学习社区 Unity3D开发者 这是一个专注于Unity引擎的开发者社区&#xff0c;汇聚了众多Un…

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)

参考文章&#xff1a;Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具&#xff0c;放到C盘根目录&#xff0c; 2.1 打开windows Powershell&#xff08;WinX&#xff09;&#xff0c;下边那个最好。 输入两条指令&a…

[0405].第05节:搭建Redis主从架构

Redis学习大纲 一、3主3从的集群配置&#xff1a; 1.1.集群规划 1.分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 2.每组是一主一从&#x…

数据结构(Java版)第八期:LinkedList与链表(三)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、链表中的经典面试题 1.1. 链表分割 1.2. 链表的回文结构 1.3. 相交链表 1.4. 环形链表 一、链表中的经典面试题 1.1. 链表分割 题目中要求不能改变原来的数据顺序&#xff0c;也就是如上图所示。…

flutter R库对图片资源进行自动管理

项目中对资源的使用是开发过程中再常见不过的一环。 一般我们在将资源导入到项目中后&#xff0c;会通过资源名称来访问。 但在很多情况下由于我们疏忽输入错了资源名称&#xff0c;从而导致资源无法访问。 所以&#xff0c;急需解决两个问题&#xff1a; 资源编译期可检查可方…

doc、pdf转markdown

国外的一个网站可以&#xff1a; Convert A File Word, PDF, JPG Online 这个网站免费的&#xff0c;算是非常厚道了&#xff0c;但是大文件上传多了之后会扛不住 国内的一个网站也不错&#xff1a; TextIn-AI智能文档处理-图像处理技术-大模型加速器-在线免费体验 https://…

计算机网络 (41)文件传送协议

前言 一、文件传送协议&#xff08;FTP&#xff09; 概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff09;是互联网上使用得最广泛的文件传送协议。FTP提供交互式的访问&#xff0c;允许客户指明文件的类型与格式&#xff08;如指明是否使用ASCII码&#xff0…

软件测试 —— 自动化测试(Selenium)

软件测试 —— 自动化测试&#xff08;Selenium&#xff09; 什么是SeleniumPython安装Selenium1.安装webdirver-manager2.安装Selenium 写一个简单用例CSS_SELECTOR和XPATH浏览器快速定位页面元素浏览器的前进&#xff08;forward&#xff09;&#xff0c;后退&#xff08;bac…