首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript 的优雅编程技巧:Singleton Pattern

JavaScript 的优雅编程技巧:Singleton Pattern

作者头像
Immerse
发布于 2024-03-13 07:22:01
发布于 2024-03-13 07:22:01
14200
代码可运行
举报
文章被收录于专栏:沉浸式趣谈沉浸式趣谈
运行总次数:0
代码可运行

JavaScript 的优雅编程技巧:Singleton Pattern

定义

  • 单例模式:保证一个类仅有一个实例,并提供一个访问的全局访问点。

特点

  1. 1. 仅有一个实例对象
  2. 2. 全局都可访问该实例
  3. 3. 主动实例化
  4. 4. 延迟实例化

类似单例模式的使用实践

  1. 1. jQuery, lodash, moment ....
  2. 2. 电商中的购物车(因为一个用户只有一个购物车)
  3. 3. Vue 或 React 中全局状态管理(Vuex、Redux、Pinia)
  4. 4. 全局组件

关键步骤及实现

  • • 关键步骤:实现一个标准的单例模式其实就是用一个变量来表示是否已经为当前类创建过实例化对象,若创建过,在下次获取或创建实例时直接返回之前创建的实例化对象即可
  • • 如下代码:可称为:简单版 单例模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var CreateStr = function (str) {
    this.str = str;
    this.instance = null;
};

CreateStr.prototype.getStr = function () {
    console.log(this.str);
};

CreateStr.getInstance = function (str) {
    if (!this.instance) {
        this.instance = new CreateStr(str);
    }
    return this.instance;
};

var a = CreateStr.getInstance('s1');
var b = CreateStr.getInstance('s2');
console.log('a ------>', a); // CreateStr { name: 's1', instance: null }
console.log('b ------>', b); // CreateStr { name: 's1', instance: null }
a.getStr(); //  s1
b.getStr(); //  s1
console.log(a === b); // true
  • • 以上通过构造函数的方式来创建有一个问题,这个类不具有透明性(调用者并不知道这是一个单例类),因为这里使用的是 Person.getInstance 的方法来获取的实例化对象。
  • • 改进后:可称为:透明版 单例模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var CreateStr = (function () {
    var instance = null;

    return function (str) {
        if (instance) {
            return instance;
        }
        this.str = str;
        return (instance = this);
    };
})();

CreateStr.prototype.getStr = function () {
    console.log(this.str);
};

let a = new CreateStr('s1');
let b = new CreateStr('s2');

console.log('a ------>', a); // { str: 's1' }
console.log('b ------>', b); // { str: 's1' }
a.getStr(); //  s1
b.getStr(); //  s1
console.log(a === b); // true
  • • 通过以上的改进方式,主要目的是使用 new 操作符来获取单列对象。
  • • 但以上代码还有一个问题,就是当我们需要创建很多个字符串时,要让这个单例类变成一个可产生多个实例的类,所有我们要将管理单例的操作和对象创建的操作分离开来。
  • • 再次改进后:可称为:代理版 单例模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function CreateStr(str) {
    this.str = str;
    this.getStr();
}

CreateStr.prototype.getStr = function () {
    console.log(this.str);
};

var ProxyObj = (function () {
    var instance = null;
    return function (str) {
        if (!instance) {
            instance = new CreateStr(str);
        }
        return instance;
    };
})();

var a = new ProxyObj('s1');
var b = new ProxyObj('s2');
console.log('a ------>', a); // CreateStr { str: 's1' }
console.log('b ------>', b); // CreateStr { str: 's1' }
a.getStr(); //  s1
b.getStr(); //  s1
console.log('b ------>', a === b); // true

适用场景

  1. 1. 全局缓存管理器
  2. 2. 消息总线
  3. 3. 购物车
  4. 4. 全局状态管理
  5. 5. 全局事件管理器

优缺点

  • • 优点:
    1. 1. 全局访问和单一实例:因为全局仅有一个实例对象,所以对单例的多个实例化都会得到的同一个实例,这就可以确保所有的对象都可访问一个实例。
    2. 2. 节省资源:因为全局仅有一个实例对象,所以可节约系统资源,避免频繁创建和销毁对象,造成系统性能的浪费
  • • 缺点:
    1. 1. 违反单一职责原则:单例模式往往负责创建和管理实例,可能会导致职责过重
    2. 2. 紧密耦合:引入了全局访问,使代码过度依赖,难以维护和测试
Tip: 文章部分内容参考于曾探大佬的《JavaScript 设计模式与开发实践》。文章仅做个人学习总结和知识汇总

特殊字符描述

•问题标注 Q:(question)

•答案标注 R:(result)

•注意事项标准:A:(attention matters)

•详情描述标注:D:(detail info)

•总结标注:S:(summary)

•分析标注:Ana:(analysis)

•提示标注:T:(tips)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 非同质前端札记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript 设计模式 —— 单例模式
从事开发岗位也有一年多的时间了,见识过陈年老项目,也从零到一搭建过一个项目。随着项目和业务的不断扩张,写下的代码如果没有进行设计,就渐渐变成了 emm ... x 山,怎么写都不对劲,过段时间就想着重构。
前端LeBron
2022/11/21
4390
JavaScript 设计模式 —— 单例模式
设计模式 - 单例模式 - JavaScript
如果一个类负责连接数据库的线程池、日志记录逻辑等等,此时需要单例模式来保证对象不被重复创建,以达到降低开销的目的。
心谭博客
2020/04/20
2980
超全60000多字详解 14 种设计模式 (多图+代码+总结+Demo)
Immerse
2024/03/13
1460
超全60000多字详解 14 种设计模式 (多图+代码+总结+Demo)
JS常用设计模式解析01-单例模式
考虑实现如下功能,点击一个按钮后出现一个遮罩层。 原始办法:我们只需要实现一个创建遮罩层的函数并将其作为按钮点击的回调事件即可。如下:
love丁酥酥
2018/08/27
7530
JS常用设计模式解析01-单例模式
「设计模式 JavaScript 描述」单例模式
单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器中的 window 对象等。在 JavaScript 开发中,单例模式的用途同样非常广泛。试想一下,当我 们单击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少 次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建。
用户8921923
2022/10/24
8960
JS 设计模式之单例模式(创建型)
一般情况下,当我们创建了一个类(本质是构造函数)后,可以通过 new 关键字调用构造函数进而生成任意多的实例对象。像这样:
Leophen
2021/06/21
7300
JS 设计模式之单例模式(创建型)
设计模式之单例模式
单例模式是一种保证一个类仅有一个实例,并提供一个全局访问点的设计模式,它还有些许其他的叫法,比如说懒汉模式、单子模式等。那么这种设计模式解决了一个什么事情呢?我们来看下这样一段代码
江涛学编程
2022/04/01
3770
单例模式
单例模式Singleton Pattern又名单件模式或单态模式,属于创建型模式,其涉及到一个单一的类,该类负责创建所需的对象,同时确保只有单个对象被创建,这个类提供了一种访问其唯一的对象的方式,保证访问的对象是只实例化一次的对象类。
WindRunnerMax
2020/10/27
1.2K0
设计模式之单例模式
单例模式是创建对象最简单的方式。单例模式的定义 是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
一粒小麦
2019/10/23
6560
设计模式之单例模式
使用合适的设计模式一步步优化前端代码
该文介绍了设计模式及其在JavaScript中的应用,包括单例模式、观察者模式、工厂模式等。
iKcamp
2018/01/04
8200
使用合适的设计模式一步步优化前端代码
JavaScript设计模式与开发实践 - 单例模式
引言 本文摘自《JavaScript设计模式与开发实践》 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。 在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器中的window对象等。 模式定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 模
laixiangran
2018/04/11
7270
JavaScript设计模式之单例模式
https://github.com/ahwgs/design-pattern-learning/tree/master/4.JavaScript%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F
w候人兮猗
2020/07/01
3350
javascript设计模式一: 单例模式
作为一个半路出家的前端,随着项目经验的积累,也越来越意识到原生js的博大精深,最近正在研究js设计模式,接下来每学一个设计模式就是写篇文章做笔记,其实主要还是代码和设计思想的结合,努力体会,多思考合适自己项目中的应用场景,争取实际应用到实际项目中。
前端_AWhile
2019/08/29
5280
设计模式- 单例模式(Singleton Pattern)
定义(单例模式又称单件模式) 单件模式(Singleton Pattern)要求一个类有且仅有一个实例,并且提供了一个全局的访问点,在同一时刻只能被一个线程所访问。 单件类只能有一个实例。 单件类必须自身创建唯一实例。 单件类必须给所有其它对象提供唯一实例。 C#例子 /// <summary> /// 单件模式实现方式:简单线程安全。 /// </summary> public sealed class Singletion { //私有构造函
易兒善
2019/05/10
6590
前端的设计模式系列-单例模式
代码也写了几年了,设计模式处于看了忘,忘了看的状态,最近对设计模式有了点感觉,索性就再学习总结下吧。
windliang
2022/08/20
3540
前端的设计模式系列-单例模式
JavaScript设计模式 单例模式
面向对象的单例模式,是通过new关键字来实例化我们想要的对象,并将其赋值给instance。
菜的黑人牙膏
2019/01/21
5420
JS设计模式之单例模式
首先要说明的是设计模式期初并非软件工程中的概念,而是起源于建筑领域。建筑学大师(克里斯托夫·亚历山大)曾经花了很长时间(传闻说20年)研究为了解决同一问题而采用的不同的建筑结构,在这些结构当中有很多优秀的设计,而在这些设计当中又有很多相似性,因此他用“模式”来描述这种相似性。并写了一本书《模式语言》。对整个建筑领域产生了很深远的影响。
用户1687375
2019/08/14
2K0
JS设计模式之单例模式
使用Typescript创建单例类
单例设计模式是软件工程中非常著名的一种模式,它确保我们在应用程序中只有一个实例或一个类的单一实例,并提供了一种简单的方法来访问该对象。
泽霖
2023/11/12
7910
【javascript设计模式】4.单例模式
前端修罗场
2023/10/07
1640
JavaScript进阶 - JavaScript设计模式
在软件工程中,设计模式是一种被广泛接受的解决方案,用于解决特定类型的问题。JavaScript,作为一种动态、弱类型的脚本语言,拥有丰富的设计模式,可以提升代码的可读性、可维护性和复用性。本文将深入浅出地介绍几种常见的JavaScript设计模式,探讨其常见问题、易错点及如何避免,并附带代码示例。
Jimaks
2024/07/07
1120
相关推荐
JavaScript 设计模式 —— 单例模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档