首页 > 其他分享 >前端必须掌握的设计模式——单例模式

前端必须掌握的设计模式——单例模式

时间:2024-12-10 09:58:27浏览次数:6  
标签:单例 对象 前端 instance 实例 Human 设计模式 name

目录

定义

应用场景

优缺点

优点

缺点

JavaScript实现

TypeScript实现

总结


定义

        单例模式(Singleton Pattern)属于 创建型 设计模式,是经典设计模式中最简单的一种,也是开发中最常见的一种。顾名思义,单例可以理解为一个类有且仅有一个实例对象,每次创建实例对象时,如果存在实例则返回该实例。

应用场景

不适合出现多个实例的场景,都可以作为单例模式的应用场景:

  • window对象、JQuery对象、Vuex对象。
  • 登录模块弹窗。
  • 全局主题配置对象。
  • 第三方密钥对象。

优缺点

优点

  • 易维护:将维护对象目标放在一个目标上,便于管理和维护。
  • 易访问:通常可以挂载在一些根节点,以极为方便的调用方式可以直接读取。
  • 低消耗:仅维护一个对象,不会创建多个对象,资源消耗较少。

缺点

  • 安全隐患:单例对象通常会使用全局对象或者一些上层节点进行存储,容易暴露内部细节。
  • 巨石对象:若单例对象成员较多,存储在全局对象造成臃肿,难以排查形成巨石。
  • 难以扩展:没有抽象类的单例对象,违背了 单一职责原则 ,内部功能过多容易导致扩展性差等问题。

JavaScript实现

        JavaScript并不是标准的基于类的面向对象编程语言,更偏向函数性编程方式。根据这个特性,结合ES6之后的class关键字,可以基本写出Human类。

        我们创建了两个Human的实例h1和h2,分别用各自的实例对象调用talk方法,输出的分别是“Jimmy”和“Lucy”,说明我们创建了两个实例对象。

class Human {
	constructor(name) {
		this.name = name;
	} 
	talk() {
		console.log(this.name);
	}
}

const h1 = new Human('Jimmy');
const h2 = new Human('Lucy');

h1.talk(); // Jimmy
h2.talk(); // Lucy

         实现单例通常需要一个中间方法,将Human类转化成单例类,每次new这个单例函数时,都要判断实例是否存在,如果存在则直接返回,否则重新创建。

        编写getSingle方法进行调用,通过闭包的方式存储全局唯一的实例对象,无论以后new多少次,都会返回instance所在存储的实例对象。 

// 中间方法 用来将构造函数转换为单例模式 
function getSingle(fn) {
	let instance = null;
	return function(...args) {
		if (instance === null) { // 如果instance为null则创建实例
			instance = new fn(...args);
		} 
		return instance;
	}
}

class Human {
	constructor(name) {
		this.name = name;
	} 
	talk() {
		console.log(this.name);
	}
}

const SingleHuman = getSingle(Human);
const h3 = new SingleHuman('Jimmy');
const h4 = new SingleHuman('Lucy');

h3.talk(); // Jimmy
h4.talk(); // Jimmy

TypeScript实现

        TypeScript的写法更像是那种比较标准的基于类的写法,可以利用private的特性来控制构造函数的可访问性,使用静态属性去存储实例,再通过静态方法的调用方式去实现。

class Human {
	private static instance: Human; // 静态属性,用于存储全局唯一的实例
    private name: string;
	// 私有构造方法 无法使用new调用
	private constructor(name: string) {
		this.name = name;
	}

	public static getInstance(name: string): Human {
		if (Human.instance === null) {
			Human.instance = new Human(name);
		}
		return Human.instance;
	}
}

const h1 = Human.getInstance('Jimmy');
const h2 = Human.getInstance('Lucy');

console.log(h1 === h2); // true

总结

        设计模式对于前端而言需要细细品味,多看一次多思考一次可能会有新的收获,无形中会改变你的编码思路,提高代码质量。前端必须掌握的设计模式系列持续更新,如果对您有帮助希望多多点赞哦!

标签:单例,对象,前端,instance,实例,Human,设计模式,name
From: https://blog.csdn.net/mayuhao0000/article/details/144351299

相关文章

  • 第 135 期 零基础 Shopify 前端教程 常用方法演示 修改店铺必看
    通过YouTube观看本期Shopify教程面向Shopify个人卖家和运营人员的零基础前端教程,看懂这一期视频教程,你就能修改常用的Shopify主题代码了。如果你没有前端基础,掌握这一期视频里的内容,比你去网上搜索和浏览n篇帖子都更直接有效。看一篇教程只是了解一种方法,而学会这期......
  • 说说你对持续集成的理解,它解决什么问题以及如何在前端中运用?
    持续集成(ContinuousIntegration,简称CI)是一种软件开发实践,旨在频繁地将代码集成到共享存储库中。每次集成都通过自动化的构建(包括编译、打包、测试)来验证,从而尽早地发现集成错误。CI解决的问题:尽早发现集成问题:传统的开发模式中,集成通常发生在项目后期,此时解决冲突的成本非常......
  • 微前端实战:大型前端应用的拆分与治理
    "这个系统太庞大了,每次发布都提心吊胆..."上个月的技术评审会上,我们团队正面临一个棘手的问题。一个运行了两年的企业级中后台系统,代码量超过30万行,构建时间长达20分钟,任何小改动都可能引发意想不到的问题。作为技术负责人,我决定是时候引入微前端架构了。经过一个月的......
  • 在工作中有没有遇到过哪些前端样式你是用css做不出来的?做不出来怎么办?
    在前端开发工作中,确实会遇到一些纯粹用CSS难以实现或实现成本过高的样式效果。以下列举一些常见情况以及对应的解决方案:1.复杂的形状和图形:问题:CSS主要擅长处理矩形、圆形等基本形状,对于一些不规则图形、复杂的曲线或动画图形,使用CSS实现起来非常困难,代码量大且难以......
  • 前端 js + html + css 特效 001
    <!DOCTYPEhtml><htmllang="en"><head><title>CodeTheWorld-Electricstrings</title><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><sc......
  • Chromium源码分析三:Chromium中用到的设计模式
    在阅读Chromium源码过程中,主要看的是公司自研的部分,不能对外分享。在自研部分中,用到了很多设计模式。比如:js注册监听函数,底层发现登录状态发生变化,产生登录或退登事件,事件从底层传到js层,就主要用到了观察者模式、代理模式、桥接模式、命令模式等。下面内容是通过询问AI生成的文......
  • 前端日志监控
    一、前端错误的捕获:在JavaScript日志系统中,捕获错误的范围应该全面,涵盖前端应用中可能出现的各类问题,包括语法错误、运行时错误、资源加载错误以及用户行为异常等。以下是不同类型错误的捕获方法:window.onerror:可捕获常规错误(例如语法错误,变量未定义、函数调用错误等)、计时......
  • 前端——HTML标签
    什么是HTML标签?HTML(超文本标记语言)是构建网页和网络应用的标准标记语言。HTML文档由一系列的标签(tags)构成,这些标签是构成网页内容的基础。每个标签都有特定的用途和含义,它们定义了网页的结构和内容。所有主流浏览器都支持<html>标签。现在大多使用HTML5。标签定义及使......
  • JOKER 前端框架:自带云端可视化 IDE 的创新利器
    一、框架概述在当今前端开发的多元化领域中,JOKER前端框架犹如一颗璀璨的明星,以其独特而强大的功能,为开发者开辟了一条高效、便捷的创新之路。JOKER不仅仅是一个普通的框架,它更是一个综合性的框架平台,旨在为所有可能的开发场景提供全方位、无死角的支持。其中,Joker.front作......
  • safari有一个快捷键非常好用对于前端开发人员 (Command + Option + R)重新加载页面并忽
    SyntaxError:Unexpectedtoken'}',运行前端项目,safari浏览器控制台报如上错误,检查代码没有多大括号,最后发现是浏览器缓存问题。重新加载页面并忽略缓存:按Command+Option+R,这将强制Safari重新加载页面并忽略缓存。这对于开发人员非常有用,尤其是在调试CSS或......