JS实现单例模式的6种方案汇总

yizhihongxing

下面我就详细讲解一下“JS实现单例模式的6种方案汇总”的完整攻略。

什么是单例模式

单例模式是一种常用的设计模式,它可以确保一个类只有一个实例,并提供了一个全局访问点。这对于管理共享的资源非常有用,比如线程池、数据库连接池等。

为什么要使用单例模式

使用单例模式可以避免不必要的资源浪费,提高程序性能,并且可以确保全局的一致性。

6种方案汇总

1. 普通模式

这种实现方式比较简单,只需要用一个变量来存储实例,然后在实例化时判断一下该变量是否已经保存了一个实例即可。
示例代码:

var Singleton = function(name){
    this.name = name;
    this.instance = null;
};
Singleton.prototype.getName = function(){
    console.log(this.name);
};
Singleton.getInstance = function(name){
    if(!this.instance){
        this.instance = new Singleton(name);
    }
    return this.instance;
};
var a = Singleton.getInstance('aa');
var b = Singleton.getInstance('bb');
console.log(a === b);// true

2. 透明的单例模式

透明的单例模式指的是,在调用getInstance方法时,直接返回单例类的实例对象。这种方式的优点是调用方便,但缺点是暴露了实现方式,不符合封装思想。
示例代码:

var Singleton = (function(){
    var instance;
    var Singleton = function(name){
        if(!instance){
            this.name = name;
            instance = this;
        }
        return instance;
    };
    Singleton.prototype.getName = function(){
        console.log(this.name);
    };
    return Singleton;
})();
var a = new Singleton('aa');
var b = new Singleton('bb');
console.log(a === b);// true

3. 代理模式的单例模式

在代理模式中,我们可以将一个模块的实例保存在代理模块中,这样在每次使用时,代理模块会返回这个实例。这种方式比较节省资源,且易于管理。
示例代码:

var Singleton = function(name){
    this.name = name;
};
Singleton.prototype.getName = function(){
    console.log(this.name);
};
var SingletonProxy = (function(){
    var instance;
    return function(name){
        if(!instance){
            instance = new Singleton(name);
        }
        return instance;
    }
})();
var a = new SingletonProxy('aa');
var b = new SingletonProxy('bb');
console.log(a === b);// true

4. 构造函数单例模式

构造函数单例模式,指的是在创建实例时,先判断是否存在该实例,如果存在,就直接返回该实例。
示例代码:

var Singleton = function(name){
    this.name = name;
    if(typeof Singleton.instance === 'object'){
        return Singleton.instance;
    }
    Singleton.instance = this;
    return this;
};
Singleton.prototype.getName = function(){
    console.log(this.name);
};
var a = new Singleton('aa');
var b = new Singleton('bb');
console.log(a === b);// true

5. 惰性单例模式

惰性单例模式指的是在需要使用实例时,才将实例化的过程执行一遍,这也是最常用到的单例模式。
示例代码:

var Singleton = function(name){
    this.name = name;
};
Singleton.prototype.getName = function(){
    console.log(this.name);
};
Singleton.getInstance = (function(){
    var instance;
    return function(name){
        if(!instance){
            instance = new Singleton(name);
        }
        return instance;
    }
})();
var a = Singleton.getInstance('aa');
var b = Singleton.getInstance('bb');
console.log(a === b);// true

6. ES6中的单例模式

在ES6中,可以利用静态属性来实现单例模式。代码如下:

class Singleton{
    constructor(name){
        this.name = name;
        if(typeof Singleton.instance === 'object'){
            return Singleton.instance;
        }
        Singleton.instance = this;
        return this;
    }
    getName(){
        console.log(this.name);
    }
    static getInstance(name){
        return new Singleton(name);
    }
}
let a = Singleton.getInstance('aa');
let b = Singleton.getInstance('bb');
console.log(a === b);// true

至此,关于JS实现单例模式的6种方案就讲解完毕了。

以下是两条示例说明:

第一条示例说明:

有一个应用程序,需要创建多个数据库连接池,并且需要在整个应用程序环境中共享这些连接池。可以使用单例模式来确保仅有一个数据库连接池实例,并且让所有使用该连接池的对象共享这个实例。

// 连接池类
class ConnectionPool{
    constructor(){
        // 假设初始化一些数据库连接等资源
    }
    // 假设还有其它方法来操作数据库
}
// 在连接池类中利用静态属性实现单例模式
ConnectionPool.instance = null;
ConnectionPool.getInstance = function(){
    if(!ConnectionPool.instance){
        ConnectionPool.instance = new ConnectionPool();
    }
    return ConnectionPool.instance;
}
// 其它使用者中可以这样使用
let pool = ConnectionPool.getInstance();

第二条示例说明:

有一个页面,需要生成唯一的弹出窗口,每次只能显示一个窗口,可以使用单例模式来确保仅有一个弹出窗口实例,并且让所有使用该窗口的对象共享这个实例。

// 弹出窗口类
class Popup{
    constructor(){
        // 假设初始化一些弹出窗口需要的资源
    }
    // 假设还有其它方法来操作弹出窗口
}
// 在弹出窗口类中利用惰性单例模式实现单例模式
Popup.instance = null;
Popup.getInstance = function(){
    if(!Popup.instance){
        Popup.instance = new Popup();
    }
    return Popup.instance;
}
// 其它使用者中可以这样使用
let popup = Popup.getInstance();

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现单例模式的6种方案汇总 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • Javascript中正则表达式的使用及基本语法

    下面是Javascript中正则表达式的使用及基本语法的完整攻略。 一、什么是正则表达式 正则表达式,也称为正规表示式、regex或regexp,是用于匹配字符串中模式的一种表达式。正则表达式在大多数编程语言中都是支持的,它允许我们快速地检索和替换文本。 二、正则表达式的语法 Javascript中使用正则表达式时,需要通过RegExp对象来创建和使用。其基…

    JavaScript 2023年5月19日
    00
  • Vue中router-link如何添加mouseover提示

    要在Vue中使用mouseover提示,我们可以使用title属性。而对于router-link组件,要使用mouseover提示,我们可以在组件内部使用slot来传递title属性。 以下是添加mouseover提示的步骤: 在router-link标签内部使用slot,传递属性title,如下所示: <router-link to="/&…

    JavaScript 2023年6月11日
    00
  • Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例

    标题:Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例 本文介绍Python cookbook中关于针对任意多的分隔符拆分字符串的操作示例,涉及到字符串的分割、切片、正则表达式等多种方法。 示例一:使用字符串的split方法进行分割操作 在Python中,可以使用字符串的split方法对字符串进行分隔,拆分为指定分隔符的多个…

    JavaScript 2023年6月10日
    00
  • 文件的读出 编辑 管理

    文件的读出 编辑 管理 文件的读出 编辑 管理指的是针对文本文件进行查看、修改和删除操作。在操作时,我们可以使用命令行或者各种编辑器来实现对文件的管理。 文件的读出 我们可以使用命令行端(Linux或者Windows命令行)来实现对文件的读出。具体操作如下: 打开命令行(Linux终端或者Windows命令提示符)。 进入到对应的文件所在的目录下。 输入命令…

    JavaScript 2023年6月10日
    00
  • 原生js实现星星闪烁效果

    下面是“原生js实现星星闪烁效果”的完整攻略。 1. 实现思路 星星的闪烁效果可以通过控制星星的透明度来实现。具体来说,我们可以通过逐渐改变星星的透明度让星星出现或消失,从而达到闪烁的效果。 2. 实现步骤 2.1 创建星星 首先,我们需要先创建星星的元素,可以使用canvas或者div来实现。 2.2 实现闪烁效果 为了实现闪烁效果,我们需要按照一定的时间…

    JavaScript 2023年6月10日
    00
  • JavaScript 笔记

    JavaScript 简介 JavsScript 于 1995 年由 Brendan Eich 用时 10 天写出,用于网景浏览器。最初的名字叫 LiveScript,也被部分员工称为 Mocha。那时 Java 语言很流行,出于商业化的考量,更名为 JavaScript,但两者之间没有关联。 最早的 JS 作为脚本语言给浏览器增加一些诸如鼠标跟随等交互性特…

    JavaScript 2023年5月7日
    00
  • JavaScript提升性能的常用技巧总结【经典】

    JavaScript提升性能的常用技巧总结【经典】 在我们编写JavaScript代码的时候,要尽可能地提高代码的性能,使得我们的程序更为流畅、快速地运行。在这里,我们将会给你介绍一些在日常开发当中常用的JavaScript性能优化技巧。 1. 如何更好的处理循环 循环是JavaScript中经常出现的一种语法,为了使程序的性能更好,可以用以下方式更好的处理…

    JavaScript 2023年6月10日
    00
  • php过滤HTML标签、属性等正则表达式汇总

    PHP过滤HTML标签、属性等正则表达式汇总 在开发网页或者Web应用的过程中,往往需要对用户提交的数据进行过滤和清理,以防止恶意脚本或病毒的注入,从而保证网站的安全性和稳定性。其中最常见的情况就是过滤HTML标签和属性。本文将介绍PHP中常用的过滤HTML标签、属性等的正则表达式汇总。 过滤HTML标签 PHP中可以使用正则表达式函数preg_replac…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部