js单例模式

news2024/12/28 17:41:07

单例模式是一种常见的设计模式,在JavaScript中也有广泛应用,以下是关于它的详细介绍:

定义

  • 单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在JavaScript中,虽然没有像传统面向对象语言中的类的概念,但可以通过对象字面量、构造函数、闭包等方式来实现单例模式。

实现方式

对象字面量方式

const singleton = {
    property: "Some value",
    method: function() {
        console.log("This is a method in the singleton object.");
    }
};
  • 这种方式简单直接,创建了一个包含属性和方法的对象字面量,并且该对象在全局范围内只有一个实例。可以通过 singleton.propertysingleton.method() 来访问和调用其中的成员。

构造函数与闭包结合方式

function Singleton() {
    if (!Singleton.instance) {
        Singleton.instance = this;
        this.property = "Some value";
        this.method = function() {
            console.log("This is a method in the singleton instance.");
        };
    }
    return Singleton.instance;
}

const instance1 = new Singleton();
const instance2 = new Singleton();

console.log(instance1 === instance2); // true
  • 在构造函数 Singleton 内部,通过判断 Singleton.instance 是否存在来确保只有一个实例被创建。如果不存在,则将当前实例赋值给 Singleton.instance ,并添加属性和方法。后续每次调用 new Singleton() 时,都会返回同一个实例。

使用ES6的类和静态属性

class Singleton {
    constructor() {
        if (!Singleton.instance) {
            Singleton.instance = this;
            this.property = "Some value";
            this.method = function() {
                console.log("This is a method in the singleton instance.");
            };
        }
        return Singleton.instance;
    }

    static getInstance() {
        if (!Singleton.instance) {
            Singleton.instance = new Singleton();
        }
        return Singleton.instance;
    }
}

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2); // true
  • 定义了一个 Singleton 类,在构造函数中同样进行实例的唯一性判断和创建。同时,提供了一个静态方法 getInstance ,用于获取单例实例,这样可以更方便地在其他地方获取单例对象,而不需要直接调用构造函数。

应用场景

全局状态管理

  • 在JavaScript应用中,如Vuex、Redux等状态管理库的核心原理就部分地运用了单例模式。以Vuex为例,整个应用中的状态存储在一个唯一的store实例中,各个组件都可以访问和修改这个store中的状态,确保了状态的一致性和唯一性。
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({
    state: {
        count: 0
    },
    mutations: {
        increment(state) {
            state.count++;
        }
    }
});

export default store;

数据库连接池

  • 在与数据库交互的应用中,为了避免频繁地创建和销毁数据库连接,通常会使用数据库连接池来管理连接。连接池可以设计成单例模式,确保整个应用中只有一个连接池实例,所有需要数据库连接的地方都从这个连接池中获取连接,提高性能和资源利用率。
const mysql = require('mysql');

class DatabasePool {
    constructor() {
        if (!DatabasePool.instance) {
            this.pool = mysql.createPool({
                connectionLimit: 10,
                host: 'localhost',
                user: 'root',
                password: 'password',
                database: 'mydb'
            });
            DatabasePool.instance = this;
        }
        return DatabasePool.instance;
    }

    getConnection(callback) {
        this.pool.getConnection(callback);
    }
}

const pool = new DatabasePool();
pool.getConnection((err, connection) => {
    if (err) throw err;
    // 使用连接进行数据库操作
    connection.release();
});

日志记录器

  • 在应用中,通常需要一个统一的日志记录器来记录各种操作和错误信息。单例模式可以确保整个应用中只有一个日志记录器实例,方便对日志进行统一管理和配置,避免多个日志记录器之间的冲突和混乱。
class Logger {
    constructor() {
        if (!Logger.instance) {
            this.logs = [];
            Logger.instance = this;
        }
        return Logger.instance;
    }

    log(message) {
        const timestamp = new Date().toISOString();
        this.logs.push(`${timestamp} - ${message}`);
        console.log(message);
    }

    getLogs() {
        return this.logs;
    }
}

const logger = new Logger();
logger.log("This is a log message.");
logger.log("Another log message.");
console.log(logger.getLogs());

优点

  • 确保唯一性:保证一个类只有一个实例存在,避免了因创建多个实例而导致的资源浪费和数据不一致等问题。
  • 全局访问点:提供了一个全局可访问的点来获取该实例,方便在不同的模块和代码位置共享和使用该实例,提高了代码的可维护性和可扩展性。

缺点

  • 违反单一职责原则:单例类可能会承担过多的职责,因为它既要负责自身的实例化和管理,又要提供各种业务方法和属性,导致类的职责不单一,不利于代码的维护和测试。
  • 隐藏依赖关系:由于单例模式通常提供全局访问点,使得代码中对单例实例的依赖关系变得不明显,可能会导致代码的耦合度增加,不利于代码的解耦和重构。

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

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

相关文章

【Compose multiplatform教程12】【组件】Box组件

查看全部组件文章浏览阅读493次,点赞17次,收藏11次。alignment。https://blog.csdn.net/b275518834/article/details/144751353 Box 功能说明:简单的布局组件,可容纳其他组件,并依据alignment属性精确指定内部组件的对…

RT-DETR学习笔记(3)

九、损失函数 整理所需参数 decoder的输出结果:6层decoderlayer的类别以及bbox预测 将500个query拆分成300(300个query)200(denoising query) 1. 最后一层的decoder的输出的300部分,单独存储到out中的"pred_logits"和“…

处理元素卡在视野边界,滚动到视野内

效果图如下: 本示例处理场景:点击底部的折叠面板,展开后移动端滚动条位置不变,导致展开内容在视图外。造成面板展开无内容的错觉。 处理核心API: IntersectionObserver 此API可绑定元素并监听元素是否在视野内。若在视野外​​​…

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署 flyfish 1. 确保 vm.max_map_count ≥ 262144 这是指要调整Linux内核参数vm.max_map_count,以确保其值至少为262144。这个参数控制着进程可以映射的最大内存区域数量。对于某些应用程序(如Ela…

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现 关于鸿蒙云捐助项目,前面的内容已使用云函数,云数据库分别实现云捐助项目首页中的项分类导航,底部导航,轮播图功能,这里继续实现云数据库加载捐赠…

Confluent Cloud Kafka 可观测性最佳实践

Confluent Cloud 介绍 Confluent Cloud 是一个完全托管的 Apache Kafka 服务,提供高可用性和可扩展性,旨在简化数据流处理和实时数据集成。用户可以轻松创建和管理 Kafka 集群,而无需担心基础设施的维护和管理。Confluent Cloud 支持多种数据…

SpringCloudAlibaba升级手册-nacos问题记录

目录 一、前言 二、升级过程 1.问题 2.原因 3.出处 4.理论解决 5.测试环境问题 6.Spring Cloud Alibaba版本对比 7. Spring Cloud Alibaba适配组件版本对比 8.降低Spring Cloud版本 9.SpringCloud与SpringBoot兼容对比表 10.naocs-client版本对比 三、最终解决 一…

15、【OS】【Nuttx】OS裁剪,运行指定程序,周期打印当前任务

背景 接之前wiki【Nsh中运行第一个程序】https://blog.csdn.net/nobigdeal00/article/details/144728771 OS还是比较庞大,且上面搭载了Nsh(Nuttx Shell),需要接入串口才能正常工作,一般调试的时候用,非调试…

C# 窗体应用程序嵌套web网页,基于谷歌浏览器内核(含源码)

有一个winform项目,需要借助一个web项目来显示,并且对web做一些操作,web页目是需要用谷歌内核,基于谷歌 Chromium项目的开源Web Browser控件来开发写了一个demo。 安装步骤 第一步:右键项目,点击 管理NuGet程序包 , 输…

通过远程控制软件实现企业高效协作

在这个信息技术迅猛发展的时代,远程办公已经成为一种趋势,而远程控制软件则是连接分散团队的重要工具。技术的革新不仅推动了远程控制软件的广泛应用,也为现代办公带来了高效的协作体验。本文将探讨远程控制软件的发展,并以RayLin…

赋能开发者 | 麒麟信安受邀参加2024开放原子开发者大会,以技术为引领,以人才创发展

12月20至21日,以“一切为了开发者”为主题的“2024开放原子开发者大会暨首届开源技术学术大会”在湖北武汉举办。本届大会由开放原子开源基金会、中国通信学会联合主办,旨在贯彻落实国家软件发展战略,加速培育壮大我国开源生态。工业和信息化…

每天40分玩转Django:Django国际化

Django国际化 一、今日学习内容概述 学习模块重要程度主要内容国际化基础⭐⭐⭐⭐⭐基本概念、配置设置字符串翻译⭐⭐⭐⭐⭐翻译标记、消息文件模板国际化⭐⭐⭐⭐模板标签、过滤器动态内容翻译⭐⭐⭐⭐模型字段、表单翻译 二、国际化基础配置 # settings.py# 启用国际化 …

Elasticsearch 国产化替代方案之一 Easysearch 的介绍与部署指南

一、前言 在国内数字化转型浪潮和 信创 大背景下,“替代进口”成为许多企业级应用所需要面对的重要课题,搜索领域也不例外。 Elasticsearch(简称 ES)作为一款业界领先的全文搜索和分析引擎,虽然功能强大,但…

Ubuntu 24.04.1 LTS 配置静态固定IP地址

查看网络配置信息 ip addr使用该命令查看网卡名字,一般是ens33或者ens32 修改配置文件 打开 /etc/netplan/下面的yaml配置文件 根据自己的需要配置 network:ethernets:ens33: # 配置的网卡的名称addresses: [192.168.23.140/24] # 配置的静态ip地址和掩码d…

Deep Deterministic Policy Gradient (DDPG)算法

代码 import torch import torch.nn as nn import torch.optim as optim import numpy as np import gym import random from collections import deque# 定义 Actor 网络 class Actor(nn.Module):def __init__(self, state_dim, action_dim, max_action):super(Actor, self).…

C++ OCR 文字识别

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘

学习爬虫时,遇到如下报错: 报错原因: 正则表达式的 search 或 finditer 方法没有找到任何匹配项,可能是换行符处理不当等。 解决方法如下: 在正则表达式末尾加上re.S即可,re.S是一个编译标志&#xff0c…

JVM实战—3.JVM垃圾回收的算法和全流程

大纲 1.JVM内存中的对象何时会被垃圾回收 2.JVM中的垃圾回收算法及各算法的优劣 3.新生代和老年代的垃圾回收算法 4.避免本应进入S区的对象直接升入老年代 5.Stop the World问题分析 6.JVM垃圾回收的原理核心流程 7.问题汇总 1.JVM内存中的对象何时会被垃圾回收 (1)什么…

基于SpringBoot在线音乐系统平台功能实现十八

一、前言介绍: 1.1 项目摘要 随着互联网技术的迅猛发展和普及,人们对音乐的获取和欣赏方式发生了巨大改变。传统的音乐播放方式,如CD、磁带或本地下载的音乐文件,已经不能满足用户日益增长的需求。用户更希望通过网络直接获取各…

RouYi-Vue框架,环境搭建以及使用

使用若以框架需要配置node.js,如果不了解可以去看node.js安装,uni-app的配置使用_uniapp使用nodejs类库-CSDN博客 安装若依 首先是去若以官网下载自己所需要的框架类型 RuoYi-Vue: 🎉 基于SpringBoot,Spring Security&#xff…