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

news/2024/10/19 19:31:14/
        前言,什么叫做单例模式?简单点说,单例模式就是只能创建一个由构造函数及类的实体,多次调用得到的都是第一次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/news/1438402.html

相关文章

用Redis实现获取验证码,外加安全策略

安全策略 一小时内只能获取三次,一天内只能获取五次 Redis存储结构 代码展示 import cn.hutool.core.util.RandomUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; import org.spri…

【C语言】深入解析插入排序算法

一、基本思想 插入排序(Insertion Sort)是一种简单直观的排序算法。其基本思想是将无序序列逐个插入到有序序列中,从而得到一个新的有序序列。插入排序类似于我们日常生活中整理扑克牌的过程,每次将一张牌插入到已经有序的牌中&am…

抽象的算法0.1.2版本

前言: 公式:(基础 基础 基础 ...更多的基础) 维度(影响因素) 问题 总感觉这个公式还缺了什么,将会在后续更新! 斐波那契数列 斐波那契数列(Fibonacci sequence&am…

接口请求与对象转json中字段大小写的处理

1、前端请求对象中,字段为大写的情况 》前端请求对象字段为大写 》后端接受对象字段也为大写 前后端对象字段一模一样,就是接受不到前端传过来的值,针对这种情况,只需在后端对象中加JsonProperty("Id")即可 如下所示&a…

C++ //练习 13.29 解释swap(HasPtr,HasPtr)中对swap的调用不会导致递归循环。

C Primer(第5版) 练习 13.29 练习 13.29 解释swap(HasPtr&,HasPtr&)中对swap的调用不会导致递归循环。 环境:Linux Ubuntu(云服务器) 工具:vim 解释 swap是类上自己定义的重载版本,…

【c++】weak_ptr和观察者模式

weak_ptr 的使用 #include <array> #include <memory>class A {// 类A的定义 };int main() {std

双向链表专题

文章目录 目录1. 双向链表的结构2. 双向链表的实现3. 顺序表和双向链表的优缺点分析 目录 双向链表的结构双向链表的实现顺序表和双向链表的优缺点分析 1. 双向链表的结构 注意&#xff1a; 这⾥的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;带头链表里的头节点…

阿里云ECS服务器安装docker

首先查看阿里云ECS的服务器的版本 cat /etc/redhat-release如果是Alibaba Cloud Linux release 3,请执行以下命令 添加docker-ce的dnf源。 sudo dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Alibaba Cloud Linux 3专…