单例模式,适用于对象唯一的情景(设计模式与开发实践 P4)

2023-09-15 01:32:11

上一章后续的内容是关于 JS 函数闭包的,考虑很多读者已经有了闭包基础或者希望通过实战理解,遂跳过上一章直接开始设计模式篇~

需要注意的是,代码部分仅供参考,主要关注的内容是设计模式的思想和运用,结合到自己的实战中才是最好的

单例模式

单例模式的定义是:保证一个类只有一个实例,并提供一个访问他的全局访问点

例如:线程池,全局缓存,登陆窗口(无论你点击多少次,窗口都只会创建一个)

实现

实现起来并不复杂,只需要创建一个变量来标识是否已经为某个类创建过对象,如果已经创建了,那就直接返回之前创建的对象~

const Singleton = {
  instance: null,
  getInstance: function () {
    if (!this.instance) {
      this.instance = {
        // 在这里定义单例的属性和方法
        name: "Singleton Instance",
        sayHello: function () {
          console.log("Hello from Singleton!");
        },
      };
    }
    return this.instance;
  },
};

// 使用示例
const instance1 = Singleton.getInstance();
console.log(instance1.name); // 输出: Singleton Instance
instance1.sayHello(); // 输出: Hello from Singleton!

const instance2 = Singleton.getInstance();
console.log(instance2.name); // 输出: Singleton Instance

console.log(instance1 === instance2); // 输出: true

方便结合理解,我们加入一个静态型面向对象的语言 C# 来看:

public class Singleton
{
    private static Singleton instance;

    // 私有构造函数,防止外部实例化
    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }

    // 在这里定义单例的其他属性和方法
    public string Name { get; set; }

    public void SayHello()
    {
        Console.WriteLine("Hello from Singleton!");
    }
}

代理单例

上面的代码有一个问题,你会发现 JS 部分中,一部分代码用来保证单例不重复创建,另一部分代码用来创建单例对象,显然这不是一个好的做法,如果某一天我们要改写这个单例代码,无疑会使代码变得复杂,所以引入 代理 单例模式

通过这样就使得 Singleton 成为了一个普通的类,和 Proxy 组成了单例模式!

var Singleton = function () {
  this.name = "Singleton Instance";
};

Singleton.prototype.sayHello = function () {
  console.log("Hello from Singleton!");
};

const SingletonProxy = (function () {
  var instance;
  return function () {
    if (!instance) {
      instance = new Singleton();
    }
    return instance;
  };
})();

// 使用示例
var proxyInstance1 = new SingletonProxy();
var proxyInstance2 = new SingletonProxy();

console.log(proxyInstance1.name);
console.log(proxyInstance2.name);

同样还有 C# 版的:

private class Singleton
{
    private Singleton()
    {
        // 构造函数
    }
}

public class SingletonProxy
{
    private Singleton proxyInstance;
    
    public Singleton GetInstance()
    {
        if (proxyInstance == null)
        {
            proxyInstance = Singleton.Instance;
        }
        return proxyInstance;
    }
}

惰性单例

上面的代码已经实现了惰性单例模式:只有调用的时候才实现对象的初始化,即这一段:

public Singleton GetInstance()
{
    if (proxyInstance == null)
    {
        proxyInstance = Singleton.Instance;
    }
    return proxyInstance;
}

这样使得资源和配置更灵活,且线程安全~

更多推荐

如何用一行CSS实现10种现代布局

现代CSS布局使开发人员只需按几下键就可以编写十分有意义且强大的样式规则。上面的讨论和接下来的帖文研究了10种强大的CSS布局,它们实现了一些非凡的工作。超级居中:place-items:center对于第一个“单行”布局,让我们解决所有CSS领域中最大的谜团:居中。我想让您知道,使用place-items:cente

网络安全(黑客)自学

前言我是去年8月22日才正式学习网络安全的,因为在国营单位工作了4年,在广东一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你有野心,你干的不多,领导却觉得你这个人不错。我才24周岁,实在的受不了这种工作氛围,情绪已经压制了很多久,一

2023-09-21 LeetCode每日一题(收集树中金币)

2023-09-21每日一题一、题目编号2603.收集树中金币二、题目链接点击跳转到题目位置三、题目描述给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其

精品Python商铺摊位租赁管理系统

《[含文档+PPT+源码等]精品基于Python实现的商铺摊位管理系统设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等软件开发环境及开发工具:开发语言:python使用框架:Django前端技术:JavaScript、VUE.js(2.X)、css3开发工具:pycharm、Visu

CG-78静力水准仪采用压力传感器测量液体的压差

CG-78静力水准仪采用压力传感器测量液体的压差产品概述静力水准仪是测量两点间或多点间相对高程变化的仪器。由储液器、高精度芯体和特别定制电路模块、保护罩等部件组成。沉降系统由多个同型号传感器组成,储液罐之间由通气管和通液管相连通,基准点置于一个稳定的水平基点,当测点相对于基准点发生升降时,将引起各点压力的变化。通过测量

postman如何设置才能SwitchHosts切换host无缓存请求到指定ip服务

开发测试中,遇到多版本同域名的服务使用postman进行测试,一般会搭配SwitchHosts切换host类似工具进行请求,postman缓存比较重,如何做到无缓存请求呢,下面简单记录一下如何实现首先要知道如何当前请求服务的ip是哪个打开postman依次点击/menu/view/showpostmanconsole就

【操作系统笔记】进程间通信

Linux文件系统inode节点(indexnode):给每个文件赋予一个称为i节点的数据结构。inode一开始是存储在硬盘中的,只有当文件被打开的时候,其对应的i节点才加载到内存中。总结:Linux中,用户态通过读写文件的Api进行系统调用,在内核态中,上层是虚拟文件操作系统VFS,它为用户态提供统一接口,屏蔽底层实

Git 介绍、分布式版本管理软件介绍

文章目录一.分布式文件版本管理系统二、Git介绍2.1.Git的最基本使用2.2.工作中使用版本管理工具的经验2.3.Git的存储方式简介一.分布式文件版本管理系统在分布式文件版本管理系统到来之前,市面上的文件版本管理软件都是集中式的(svn就是典型的集中式文件版本管理系统),其软件会分为客户端软件和服务端软件两个部分

MySQL的备份与恢复

备份与恢复一、备份1.1数据备份的必要性1.2数据备份分类1.2.1物理备份1.2.2逻辑备份1.3数据库备份策略1.4常用的备份方法和工具1.5数据库上云迁移二、MySQL完全备份2.1简介2.2物理冷备份与恢复2.2.1物理冷备份2.2.2解压恢复2.3mysqldump备份与恢复1)完全备份一个或多个完整的库(包

web网站学习 apache (一)

文章目录学习内容apache概述apache模式配置文件详解配置实战基于域名的虚拟主机总结题学习内容web网站学习apachenginxtomcatapache概述ApacheHTTPServer(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全

JMeter压测工具介绍、安装及汉化教程,详解安装目录结构

🧑‍💻作者名称:DaenCode🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅,闭关学习中······😎人生感悟:尝尽人生百味,方知世间冷暖。📖所属专栏:JMeter实战专栏推荐专门为Re

热文推荐