构造函数及es6类写单例模式

devtools/2024/9/22 20:57:26/
        前言,什么叫做单例模式?简单点说,单例模式就是只能创建一个由构造函数及类的实体,多次调用得到的都是第一次new出来的对象。用处有,例如在需要全局管理的资源、频繁访问的配置信息、日志记录器、 数据库连接池 等情况下都可以使用单例模式来优化资源的使用和提高系统的性能。

一、传统的构造函数写单例模式

        1、思路

                要获取想只能获取一次实体对象,我们需要在new 构造函数的时候跳出本次new的过程,要跳出此次的new过程,我们需要一个函数变量去缓存上一次new的实体对象,用于判断构造函数已经new过。

        2、普通的new构造函数

javascript">// 生命instance变量缓存已new过的实体
let instance = null;
const createSingleton = function (name) {// 如果已经new过的跳出并返回缓存的实体,始终保持一个实体if (instance) return instance;this.name = name;instance = this; // 第一次new把实体返回return instance;
}
createInstance.prototype.getname = function () {console.log(this.name)
};
const a = new createSingleton ('aaa');
const b = new createSingleton ('bbb');
a.getname(); // aaa
b.getname(); // aaa

       生命一个instance变量用于保存第一次new出来的实体对象,在构造函数原型上写一个getname的方法获取name的值。构造函数里判断构造函数是否已经实例化过,然后跳出并返回第一次的实体对象。这种写法有种缺陷,那就是会多出一个外部变量,可能会污染到全局的某个变量的,所以我使用闭包去解决这种问题。

3、结合闭包new构造函数

javascript">// IIFE执行函数返回匿名函数当作构造函数,并利用闭包缓存实例化对象
const createInstance = (function () {let  instance =  null;return function (name) {// 非第一次实例化跳出并返回第一次实体化对象if (instance) return instance;this.name = name;instance = this;return instance;}}
)();

        我们使用IIFE执行匿名函数,匿名函数里声明一个instance变量去缓存第一次实例化的对象,最后返回一个匿名函数当作构造函数。构造函数里利用instance去判断跳出此次实体化过程,在这个匿名函数里我们使用了闭包,所以我们在多次对这个构造函数实体化时,这个变量始终是第一次缓存下来的那个对象。

二、es6类写单例模式

        1、思路

              es6的类构造函数在类里面的constructor里,是个比较类似java类的一个类,所以我们可以在类里面写一个static的方法来获取这个类的实体(static是静态成员变量,可以让类不需要实例化就可以通过类去调用这个方法),并且做一些相应的判断去判断是否跳出并返回第一次的实体。

        2、实现

javascript">class Singleton {constructor(name) {this.name = name;this.instance = null;}// 构造一个广为人知的接口,供用户对该类进行实例化static getInstance(name) {if(!this.instance) {this.instance = new Singleton(name);}return this.instance;}getName () {console.log(this.name);}
}
Singleton.getInstance('aaaa').getName()
Singleton.getInstance('bbbb').getName()

        在Singletom类的构造函数里同样写一个instance缓存第一次实体化类的对象,同时还有static方法getInstance获取实体化类的对象。getInstance方法用到this.instance去判断是否已经实体化过该类跳出返回实体类,否则实体化这个类。


http://www.ppmy.cn/devtools/16856.html

相关文章

Python中使用Gradient Boosting Decision Trees (GBDT)进行特征重要性分析

在机器学习中,了解哪些特征对模型的预测有重要影响是至关重要的。这不仅帮助我们理解模型的决策过程,还可以指导我们进行特征选择,从而提高模型的效率和准确性。Gradient Boosting Decision Trees(GBDT)是一种强大的集…

mybatis-plus 动态表名简易使用

场景&#xff1a;由于有些表是分表的&#xff0c;需要给表名添加后缀才能正确地访问表&#xff0c;如sys_user_2024_01 代码 依赖版本 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><ve…

VUE3与Uniapp 三 (Class变量和内联样式)

<template><!-- 通过class绑定开启或关闭某个CSS --><view class"box" :class"{box2:true}">box1</view><view class"box" :class"{box2:isActive}">box2</view><!-- 使用三元表达式实现开启关…

力扣爆刷第127天之动态规划五连刷(整数拆分、一和零、背包)

力扣爆刷第127天之动态规划五连刷&#xff08;整数拆分、一和零、背包&#xff09; 文章目录 力扣爆刷第127天之动态规划五连刷&#xff08;整数拆分、一和零、背包&#xff09;关于0 1 背包问题的总结01背包遍历顺序&#xff1a;完全背包遍历顺序&#xff1a; 一、343. 整数拆…

vue2实现字节流byte[]数组的图片预览

项目使用vantui框架&#xff0c;后端返回图片的字节流byte[]数组&#xff0c;在移动端实现预览&#xff0c;实现代码如下&#xff1a; <template><!-- 附件预览 --><div class"file-preview-wrap"><van-overlay :show"show"><…

js网络请求---fetch和XMLHttpRequest的用法

fetch 语法规则 let promise fetch(url, [options]) //url —— 字符串&#xff1a;要访问的 URL。 //options —— 对象&#xff1a;可选参数&#xff1a;method&#xff0c;header 等。 fetch函数返回一个promise&#xff0c;若存在网络问题&#xff0c;或网址不存在&…

先进制造aps专题四 计划型简单aps系统(plan)和排产型复杂aps系统(Scheduling)的区别

计划型算法很简单&#xff0c;只考虑产品和产线/车间&#xff0c;一个产线/车间对于一个产品&#xff0c;产线/车间24小时生产&#xff0c;没有休息时间段&#xff0c;java web类型的aps系统都是这种类型&#xff0c;这种其实是计划型的aps系统(plan) 要是排产考虑产品工序&am…

《架构风清扬-Java面试系列第27讲》Java中如何正确优雅关闭线程?

这道题也是容易答错的题目之一&#xff0c;原因是因为有一个stop方法容易误导大家 一般也是考核工作三年以内的小伙伴&#xff0c;不属于有难度的题目 但由于出现频率不低&#xff0c;所以&#xff0c;钊哥有必要跟小伙伴们聊一聊 来&#xff0c;老规矩&#xff0c;在往下看答案…