Harmony设计模式-单例模式

news2024/11/29 2:47:04

Harmony设计模式-单例模式

前言

软件设计模式([Design pattern](https://baike.baidu.com/item/Design pattern/10186718?fromModule=lemma_inlink)),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

设计模式的作用是:为我们在进行稍微复杂的程序设计时,迅速提高可靠的解决方案。而不是等待问题暴露了,再去修复我们的程序

小故事

1991年,Erich Gamma 与Richard Helm, Ralph Johnson ,John Vlissides合作出版了Design Patterns - Elements of Reusable Object-Oriented Software 一书,在此书中共收录了23个设计模式

  • 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
  • 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

在实际开发中,很少会有程序员在同一个项目中全部用上以上的23种设计模式。所以边学边用、学以致用即可。

单例模式

单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。

好比如在一个规模不大的公司中,存在以下的角色

  1. 人事
  2. 财务
  3. 开发
  4. 测试
  5. 实施
  6. 运维
  7. 网管
  8. 老板

但其实由始至终,都只是你一个人在充当以上的角色而已。

使用场景

太多了

  1. 系统服务管理:鸿蒙操作系统中有很多系统服务,如系统时间管理、网络管理等。这些服务需要全局唯一的实例来提供服务,以确保服务的唯一性和一致性。通过使用单例模式,可以确保系统中只有一个这样的服务实例,方便管理和访问。
  2. 设备访问:鸿蒙操作系统中的设备访问层,如摄像头访问、传感器访问等,也需要使用单例模式来确保只有一个实例进行设备访问。这有助于避免多个实例同时访问设备导致的冲突和资源浪费。
  3. 资源管理:鸿蒙操作系统中的资源管理器,如内存管理器、文件系统管理器等,也需要使用单例模式来管理全局资源。通过单例模式,可以确保只有一个实例对资源进行管理和分配,提高系统的稳定性和性能。
  4. 全局状态管理:在鸿蒙应用开发中,经常需要全局唯一的实例来管理整个应用的配置和状态,如数据库访问对象等。通过使用单例模式,可以保证整个应用只有一个实例,避免重复实例造成的资源浪费和数据不一致。

程序设计

进入正题,众所周知,每当我们new一个实例的时候,内存中都会开辟一个新的空间,此时不同的实例是存在各自的内存空间中的。

image-20240614060533270


对应内存示意图为:

image-20240614062827544

改造版本1

因为new天生的特性就会开辟新内存空间,因此我们改造的方向是不让用户通过new来创建实例。替换成静态方法的方式来创建

image-20240614063056447

核心代码在于 static getInstance 这里,它用过判断是否已经存在实例来决定是否要执行new操作

image-20240614063405194

对比结果:

image-20240614063637583

改造版本2

但是这个时候可能会有小伙伴忘记我们使用了单例模式了,它还是一样会通过new的方式创建对象

image-20240614063803815

此时我们可以将 constructor 设置为 私有,这样当小伙伴new的时候,便会有一个语法错误提示

image-20240614064037096

ps: artTs中 不能 使用 new.target 来判断用户是否存在new的行为

完整代码

class Person {
  static instance: Person | null = null

  static getInstance() {
    if (!Person.instance) {
      Person.instance = new Person()
    }
    return Person.instance
  }

    // 设置方法为私有
    private  constructor() {   
  }
}

const p1 = Person.getInstance()
const p2 = Person.getInstance()
console.log("", p1 === p2)// true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1844574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中文分词词云图

目录 一、分词1、分词方式方法2、分词优缺点 二、jieba使用示例1、引入库2、切分模式3、加载自定义字典 三、词的可视化1、读取数据2、数据处理3、统计词频4、去除停用词5、词云图1、pyecharts绘图2、WordCloud绘图 一、分词 1、分词方式方法 以构词规则为出发点的规则分词 全…

科普文章:怎么远程监控电脑屏幕?三种监控电脑屏幕的方法

远程监控公司电脑屏幕是一项重要的管理手段,它不仅有助于提升工作效率,还能确保公司信息安全和合规性。随着远程办公的普及,这一需求变得日益重要。下面我将详细介绍几种实现远程监控公司电脑屏幕的方法,以及实施过程中需要注意的…

看完再买不后悔!希喂、小米、霍尼韦尔宠物空气净化器性价比比拼

在忙碌的工作之余,养一只猫真的能治愈一切的不快,让我们的心灵得到片刻的宁静。然而,这份宁静背后,却隐藏着一些不易察觉的烦恼——猫浮毛和异味。 猫浮毛,这个看似微不足道的小问题,实则给许多宠物主人带…

我在高职教STM32——LCD液晶显示(2)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就…

LabVIEW_TDMS

1.TDMS设置属性 想给这里写属性怎么整 使用TDMS设置属性函数时,对组名称与通道名称不设置,即可达到上图中的样式。 PS:属性名称如果设置一样则最终生效的值为最后写入的值。如将属性2修改为属性1,则最终只有1个属性1&#xff0c…

C++语法04 标准输入语句

标准输入 使用格式:cin >> 输入的意思就是把一个值放到变量里面去,也就是变量的赋值,这个值是由我们自己输入的。 (注意:输入变量前要先定义,输入完之后要按Enter键。) 输入多个变量,与输出类似,…

基于一种改进熵方法的旋转机械故障诊断模型(MATLAB)

熵的概念起源于热力学,1884年,玻尔兹曼定义熵,用以描述分子热运动的无序性和混乱度。1948年,Shannon在其发表的《AMathematicalTheoryofCommunication》中提出香农熵,首次将“熵”引入信息度量范畴,为信息论…

C语言实现树和二叉树(二)

OK,各位未来的高级程序员们,大家好,今天我们来讲解一下二叉树这个部分的第二种存储结构---------链式存储结构,相信大家对这部分内容已经很期待了,但是,这里我们在开讲之前,要先补充一个知识&am…

AJAX 综合案例-day2

Bootstrap 弹框 功能:不离开当前页面,显示单独内容,供用户操作 步骤: 1. 引入 bootstrap.css 和 bootstrap.js 2. 准备 弹框标签 ,确认结构 3. 通过 自定义属性 ,控制弹框的 显示 和 隐藏 1. 通过属性…

SAP_FICO模块-获利能力段新增特征字段

业务背景: 公司有启用获利能力分析功能,有一个销售订单接口,是通过第三方销售订单管理平台推送数据到SAP的,用户希望对接新增一个编号ID到销售订单上,并且可以用KE24/KE30报表查看显示; 对于我这么一个后勤…

小程序打开空白的问题处理

小程序打开是空白的,如下: 这个问题都是请求域名的问题: 一、检查服务器域名配置了 https没有,如果没有,解决办法是申请个ssl证书,具体看这里 https://doc.crmeb.com/mer/mer2/4257 二、完成第一步后&#…

云动态摘要 2024-06-20

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 [低至1折]腾讯混元大模型产品特惠 腾讯云 2024-06-06 腾讯混元大模型产品特惠,新用户1折起! 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用 最新产品更新 [功能优化]费用…

栈,队列,数组,链表

一.数据结构概述 数据结构是计算机底层存储,组织数据的方式。 是指数据相互之间是以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据,需要结合具体的业务场景来进行选择。 一般情况下,精心选择的数据结构可以来更高的运行或者存储效率。 二.学好数据结构三大…

AI绘画ComfyUI-插件-面部修复,快速入门安装使用!

这期给大家分享一个插件AI绘画 ComfyUI的——Impact Pack ComfyUI也是隶属于Stable Diffusion的工作流形式的AI绘画工具。 这是一个综合节点,这期先介绍下这个插件中的面部修复功能 Impact Pack插件 1、下载插件 在ComfyUI管理器中安装节点,搜索Imp…

探索磁力搜索引擎:互联网资源获取的新视角

在当今数字化社会中,寻找和获取网络资源变得更加便捷和多样化。磁力搜索引擎作为这一趋势的一部分,提供了一种新颖而有效的方法来定位和获取用户所需的文件、媒体和其他数字内容。本文将深入探讨磁力搜索引擎的工作原理、使用场景及其在网络文化中的影响…

0.6 复合视频信号(CVBS)简介

0.6 复合视频信号简介 复合视频信号指在一个信号中包含了亮度信号、色度信号与同步信号(包括场同步、行同步信号及行场消隐信号)的视频信号。又可称为 CVBS,CVBS 为 Color,Video,Blanking,Sync 或者 compo…

酷得智能 电子方案开发 单片机方案定制

手持小风扇电子方案开发,东莞酷得智能科技有限公司为您服务 东莞市酷得智能科技有限公司 在消费类电子市场深耕多年,依托于市场团队对市场的敏锐度、工程团队的技术积累、结合自身的创新以及和上游原厂深度合作,在2.4G通信、BLE、语音、马达…

java实现一个LRU缓存算法。

//LRU(Least Recently Used)缓存算法是一种常见的缓存淘汰策略, // 它的基本思想是保留最近被访问过的数据,淘汰最久未被访问的数据。下面是一个使用Java实现的简单LRU缓存算法: import java.util.LinkedHashMap; impo…

【Unity】AssetBundle打包策略

【Unity】AssetBundle打包策略 在游戏开发过程中,AssetBundle(AB)打包策略的重要性不容忽视。游戏开发者往往手动设置游戏资源包名进行管理,难免会造成资源确实或导致冗余,因此对于AB包的打包流程来说,进行策略管理显得十分重要。…

正定矩阵(Positive Definite Matrix)

正定矩阵(Positive Definite Matrix) flyfish Positive(正数) :在数学和统计学中,通常指大于零的数。在矩阵理论中,一个矩阵被称为正定,是因为它的性质类似于正数的性质。 Defini…