你不知道的javascript设计模式(五)----单例模式

简介: 你不知道的javascript设计模式(五)----单例模式

前言

前几章我们一直在为javascript设计模式的学习作一些准备,我们学习了原型编程,闭包,封装以及高阶函数等内容,从这一章节开始,我们将正式开始设计模式的学习,作为设计模式学习的第一章,我们将从最简单的设计模式,单例模式开始设计模式的相关学习


正文

单例模式的定义

保证一个类有且只有一个实例,并提供一个访问它的全局访问点

上面是对单例模式的官方定义,单例模式是一个很常见的设计模式,比如最常见的浏览器中的window对象,那些在实际业务中有且仅有一个的对象就适合单例模式来创建

实现单例模式

要实现单例模式并不难,无非就是用一个变量来标志当前对象是否已经被创建,如果没被创建就新建一个对象,如果已经创建就返回之前已经创建的对象

javascript中的单例模式

上面的那种实现方式可能更多的是接近传统面向类编程的做法,但是javascript是一门无类语言,创建单例模式并不需要先定义一个类,再由这个类去定义对象,这样的做法无异于脱裤子放屁,我们只需要保证只是一个实例就是单例模式

在js开发中,我们经常把全局变量当作单例使用,当用这种方式创建的时候,全局变量便已经是独一无二的,但是这样的做法会有很多弊端,比如引起变量污染和覆盖的问题,在越大的项目中这个问题便会暴露得越明显。

在大型项目中为了解决这个问题,我们可以用专门的文件来存储这些单例对象,然后用接口把他们暴露出去,在对应的地方按需引入

640.png


惰性单例

惰性单例指的是在需要的时候才创建对象实例,惰性单例在单例模式中占很重要的地位,这个其实我们在文章开头就已经有所介绍,Singleton并不会在页面开始的时候就创建,而是在需要的时候主动调用getInstance时候才创建,不过我们也说了,javascript是一种无类语言,基于传统面向类的方式实现的单例模式对于javascript并不是最优选择。

假设我们需要写一个登陆的弹窗,并且在点击按钮以后,就弹出登陆的弹窗,这个是很适合使用单例模式来实现的,因为我们不会点登陆就一直创建新的登陆弹窗,弹窗只会有一个,这里我们基于js的全局变量去实现这个单例模式


通用的惰性单例

上个部分虽然我们用变量去创建了一个单例模式,但是这个单例模式是违反了单一职责原则的,创建单例和管理单例都在一个函数里,而且这个函数的复用能力很差,如果下一次我们需要创建一个frame的单例,我们不得不把上面的代码复制出来一份改动中间的部分去实现单例

上一节我们在讲高阶函数的时候,讲过将业务中易变的部分封装为函数作为参数,保留不变的业务逻辑的程序设计思想,根据这个思想,其实我们可以提取出上面那个函数共同的部分

640.png

接下来我们只需要把易变的那部分封装成函数再传入就可以了,这样如果有新的业务需求,我们并不需要更新getSingle方法,只需要封装新的业务函数传入单例模式就可以了,这样是符合开放-封闭原则的

小结

这一章我们介绍了单例模式,这是我们学习的第一个设计模式,这一章我们讲到了单例模式在基于类编程传统语言中的写法,以及在js中使用全局变量实现的方法,并且还总结了上一章的内容,设计函数的过程中要考虑这个函数的复用性,是否遵循开放-封闭原则,这一章还提到了单一职责原则,会在后面的章节专门说明

小伙伴们今天的学习就到这里了,如果觉得本文对你有帮助的话,欢迎转发,评论,收藏,点赞!!!

目录
相关文章
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
501 15
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
197 2
|
设计模式 安全 Java
设计模式:单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。它通过私有化构造函数、自行创建实例和静态方法(如`getInstance()`)实现。适用于数据库连接池、日志管理器等需要全局唯一对象的场景。常见的实现方式包括饿汉式、懒汉式、双重检查锁、静态内部类和枚举。线程安全问题可通过`synchronized`或双重检查锁解决,同时需防止反射和序列化破坏单例。优点是避免资源浪费,缺点是可能增加代码耦合度和测试难度。实际开发中应优先选择枚举或静态内部类,避免滥用单例,并结合依赖注入框架优化使用。
|
设计模式 JavaScript 算法
浅谈几种js设计模式
设计模式是软件开发中的宝贵工具,能够提高代码的可维护性和扩展性。通过单例模式、工厂模式、观察者模式和策略模式,我们可以解决不同场景下的实际问题,编写更加优雅和高效的代码。
446 8
|
设计模式 存储 安全
设计模式2:单例模式
单例模式是一种创建型模式,确保一个类只有一个实例,并提供全局访问点。分为懒汉式和饿汉式: - **懒汉式**:延迟加载,首次调用时创建实例,线程安全通过双重检查锁(double check locking)实现,使用`volatile`防止指令重排序。 - **饿汉式**:类加载时即创建实例,线程安全但可能浪费内存。 示例代码展示了如何使用Java实现这两种模式。
367 4
|
设计模式 存储 安全
设计模式-单例模式练习
单例模式是Java设计模式中的重要概念,确保一个类只有一个实例并提供全局访问点。本文详解单例模式的核心思想、实现方式及线程安全问题,包括基础实现(双重检查锁)、懒汉式与饿汉式对比,以及枚举实现的优势。通过代码示例和类图,深入探讨不同场景下的单例应用,如线程安全、防止反射攻击和序列化破坏等,展示枚举实现的简洁与可靠性。
271 0
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
758 13
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
262 2
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
296 4
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
340 2