当前位置: 首页 > news >正文

TypeScript 设计模式之【单例模式】

文章目录

  • **单例模式**: 独一无二的特工
    • 我们为什么需要这样的特工?
    • 单例模式的秘密:如何培养这样的特工?
    • 特工的利与害
    • 代码实现
    • 单例模式的主要优点
    • 单例模式的主要缺点
    • 单例模式的适用场景
    • 总结

在这里插入图片描述

单例模式: 独一无二的特工

单例模式就像是一个秘密组织里的特殊特工。这个特工非常独特,整个组织里只有他一个人,而且随时待命,随叫随到。

我们为什么需要这样的特工?

因为它独一无二: 就像詹姆斯·邦德,007只有一个。我们组织不需要多个一模一样的特工,那样会造成混乱。而且它时时刻刻待命,所有人都知道去哪里找这个特工。不用满世界找,一个电话就能联系上。

单例模式的秘密:如何培养这样的特工?

特工的培训是绝密的(私有构造函数),没人知道他是怎么被训练出来的。而且他特殊联络人,组织安排了一个特殊的联络人(静态方法)。只有通过这个联络人,你才能接触到这个特工。

特工的利与害

第一,方便,所有人都知道去哪里找这个特工,不用满世界找,一个电话就能联系上;其次,唯一,组织里只有一个这样的特工。不用担心重复;最后,可靠,特工总是待命状态(静态变量),不用每次都重新培训。

代码实现

class SecretAgent {// 特工private static instance: SecretAgent;// 特工的联络人private constructor() {// 私有构造函数,防止外部实例化console.log("特工被创建了");}// 获取特工public static getInstance(): SecretAgent {if (!SecretAgent.instance) {SecretAgent.instance = new SecretAgent();}return SecretAgent.instance;}// 特工执行任务public doMission(): void {console.log("执行任务");}       
}// 联系特工
const job1 = SecretAgent.getInstance();
// 执行任务
job1.doMission(); // 输出  "特工被创建了"  "执行任务"// 再次联系特工
const job2 = SecretAgent.getInstance();
// 执行任务
job2.doMission(); // 输出 执行任务

在这里插入图片描述

单例模式的主要优点

  1. 节省资源,单例模式通过共享一个实例,避免了每次创建对象时都进行初始化,从而节省了资源,提高性能
  2. 隐藏具体实现,单例模式将对象的创建过程隐藏在内部,从而提高了代码的可维护性和可读性。

单例模式的主要缺点

单例模式将对象的创建过程隐藏在内部,难以扩展与难以调试

单例模式的适用场景

需要隐藏内部实现,共享一个实例,并且需要节省资源,提高性能。

总结

单例模式是一种创建型设计模式,它在确保一个类只有一个实例,隐藏了内部实现,并提供一个全局访问点,从而节省资源,提高性能。

喜欢的话就点个赞 ❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!

下期预告:TypeScript 设计模式之【原型模式】

相关文章:

  • 数据备份策略:保障数据安全的关键
  • 从预测性维护到智能物流:ARM边缘计算控制器的工业实践
  • C++——编写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。用指针方法处理。
  • 入门插件开发-列表插件开发-第三节:案例演示——setFilter事件讲解
  • LLMs之RAG:MemoRAG(利用其记忆模型来实现对整个数据库的全局理解)的简介、安装和使用方法、案例应用之详细攻略
  • 【自学笔记】支持向量机(4)——支持向量回归SVR
  • 国内可用ChatGPT-4中文镜像网站整理汇总【持续更新】
  • 三.python入门语法2
  • OSPF相关基础介绍及基础配置,网络工程师必修
  • redis Redis-Cluster常用命令与Redis性能监控
  • SSH防止暴力破解
  • 2024东湖高新下半年水测公示名单啦
  • 把命令的语气改成聊天的方式
  • 部署Activiti Modeler全流程(工作流引擎Activiti设计插件)
  • 软件测试CNAS实验室认证|检测报告三级审核,每一级审核什么?
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • Angular数据绑定机制
  • interface和setter,getter
  • Mybatis初体验
  • rabbitmq延迟消息示例
  • rc-form之最单纯情况
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 关于 Cirru Editor 存储格式
  • 关于extract.autodesk.io的一些说明
  • 关于List、List?、ListObject的区别
  • 猴子数据域名防封接口降低小说被封的风险
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端性能优化——回流与重绘
  • 区块链将重新定义世界
  • 十年未变!安全,谁之责?(下)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小程序开发之路(一)
  • FaaS 的简单实践
  • 阿里云服务器购买完整流程
  • ​​​​​​​​​​​​​​Γ函数
  • #define,static,const,三种常量的区别
  • (12)Linux 常见的三种进程状态
  • (3)选择元素——(17)练习(Exercises)
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (转)ABI是什么
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)大型网站的系统架构
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET 5种线程安全集合
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net dataexcel 脚本公式 函数源码
  • .NetCore部署微服务(二)