单例模式的基本用法

news2025/4/6 9:55:13
单例模式是众多设计模式中的一种,那说到设计模式,我们要想知道什么是设计模式?
设计模式就是一套反复使用、多数人知晓的、经过分类、代码设计经验总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解,保证代码的可靠性。毫无疑问,设计模式已经已经于他人系统都是多赢的;设计模式是代码编程真正工程化;
设计模式是软件工程的基石脉络,如同大厦的结构一样。

其实简单来说,设计模式就是一种解决问题的思想,打个比方来说,我们想要盖一栋欧美风格的大楼,第一次盖,不是很懂,只能仿照欧美风格的大楼的样子去一点一点设计,一点一点完善,哪里出了问题,在设定方案,去一点一点的修改,终拿出一个好的方法来,而这个时候我们就将问题记录下来,包括如何去设计的这栋欧式风格的大楼。

如果后续还想要盖一栋欧式风格的大楼,我们是不是就不用在自己去一点一点摸索了?

我们只需要拿出上一次人家盖大楼的设计方案,这样我们就可以避免了很多问题,因为在盖一栋大楼上面出现任何的问题都是致命的,而且造价也是很高的,所以我们就拿人家做好的解决方案来用,这也就是生活中就简单的,直白的设计模式的解释。

其实设计模式在我们现实生活中有很多,比如说我们去饭店吃饭,点了一个汤,服务员把汤端上来,我们直白的解决方案就是向服务员要喝汤的勺子,对吧?

因为这个是解决我们不能将汤喝到嘴里简单有效的方式,还有很多的例子,在这里就不一一的列举了,那我们就说一下我们编程语言中的设计模式,同样,我们编程语言中的设计模式也是用来解决我们编程过程当中的一些问题,它不仅仅是能解决Java问题,所有的面相对象的语言都可以用我们的设计模式来解决问题,设计模式总共有20多种,分别用来解决不同的问题,同样我们今天要介绍的单例设计模式也是用来解决问题的,那它是用来解决什么问题呢?我们先从一个例子去入手看一下。

首先我创建一个Singleton类,里面只有定义了一个num属性。

class Singleton {

int num;

}

现在我要实例化两个Singleton类的对象,想做一件事,就是我ASingleton对象的num改变,想让BSingleton对象的num也随之改变,就是想让他们两个相互知道,一个改变了num另一个要知道。该如何去实现呢?有人说将num设置为静态,其实是可以解决这个问题的,但是设置为静态会有什么样的 小问题呢?

就是我们的变量声明周期过长,如果数据量大呢?那么是不是就全部都要设置为静态,是不是不太合理?那么这个问题该怎么解决呢?

这个时候就用到了我们的单例模式,从名字上去理解,单个实例,对嘛,如果我们能保证这两个对象操作的是同一个实例,是不是就保证了它俩操作的都是同一个num?

对的,就是这样,那么我们如何去保证对象的唯一性呢?

首先我们要想,我们通过什么来创建对象呢?

构造器吧?

是的,那我们是不是不能让外部随意的去创建对象,如果还是能随便的创建,那我们怎么才能保证对象唯一性呢,怎么办呢?咱们想,如果我们将构造器私有化了,是不是外部就不能随意的去创建了?

对嘛,外部都不能访问到你的构造器,它怎么去创建你的对象呢,是的,就是这样,那我们将构造函数私有化了,无法创建对象了也不行啊,是吧,那我们如何去操作数据呢?按照封装的思想,外部不能访问了,我内部去创建自身的对象可以不?我内部创建好一个自身的对象,在向外将我创建好的对象提供出去是不是就可以了,好了,基本的原理就是这样,接下来我将问题总结一下。

如何保证对象的唯一性:

1. 不允许其他程序用new 构造器 来创建该类的对象;

2. 在该类创建一个本类实例;

3. 对外提供一个方法让其他程序可以获取该对象。

步奏:

1. 私有化该类的构造函数;

2. 通过new 构造器 在本类当中创建一个本类的对象;

3. 定义一个共有的方法,将创建的对象返回出去。

这就是我们的基本步奏,下面我们在程序中去演示一下:

class Singleton {

int num;

private Singleton(){} //第一步:构造函数私有化

private static Singleton s = new Singleton(); //第二步:在本类中实例化该类的实例

public static Singleton getInstance(){ //第三步:向外提供一个方法,将创建好的该类实例返回出去

return s;

}

}

通过测试类看一下效果:

public static void main(String[] args) {

Singleton sing1 = Singleton.getInstance();

Singleton sing2 = Singleton.getInstance();

sing1.num = 10;

sing2.num = 20;

System.out.println("sing2.num="+sing1.num);

System.out.println("sing2.num="+sing2.num);

}

结果:

sing1.num=20

sing2.num=20

从结果我们就能看到,当后一次sing2改变了num,同时sing1的num也随之改变了,解释一下为什么要将第三步的方法设置为static,因为外部无法创建我们这个类的对象,所以我们将其提升为类级别,通过类名调用,当然static也有自己的规则,所以第二步也设置为了static,而前面加上private是我们的封装思想,同时我们可以在第三步中加入参数,做一个可控的判断,如果满足条件了我们才将实例给你用,不满足条件不给你用。

这个就是单例模式的基本用法。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,

差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。(点击找小助理领取)

扫码进群领资料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html

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

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

相关文章

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle WebLogic Server 10.3.6.0.0/12.1.3.0.3/2.2.1/1.10/12.2.1.1/22.0(Application …

Pipelined-ADC设计二——结构指标及非理想因素(Part1)

本章将详细介绍电路各个模块的设计思路和设计中需要注意的关键点,给出流水线ADC中的非理想因素,并计算出流水线ADC各个模块具体指标。根据电路中信号的传输方向,依次介绍采样保持电路、Sub_ADC,MDAC 等模块的设计。(本…

【GitHub精选项目】短信系统测试工具:SMSBoom 操作指南

前言 本文为大家带来的是 OpenEthan 开发的 SMSBoom 项目 —— 一种用于短信服务测试的工具。这个工具能够发送大量短信,通常用于测试短信服务的稳定性和处理能力。在合法和道德的范畴内,SMSBoom 可以作为一种有效的测试工具,帮助开发者和系统…

关于redis单线程和IO多路复用的理解

首先,Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻,对于Redis整体而言肯定不是只有一个线程。 我们常说的Redis 是单线程,主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的,这也是 Redis 对外提供键值存储…

【ARMv8M Cortex-M33 系列 1 -- SAU 介绍】

文章目录 Cortex-M33 SAU 介绍SAU 的主要功能包括SAU 寄存器配置示例 Cortex-M33 SAU 介绍 在 ARMv8-M 架构中,SAU(Security Attribution Unit)是安全属性单元,用于配置和管理内存区域的安全属性。SAU 是 ARM TrustZone 技术的一…

论文阅读——Flamingo

Flamingo: a Visual Language Model for Few-Shot Learning 模型建模了给定交织的图片或支视频的条件下文本y的最大似然: 1 Visual processing and the Perceiver Resampler Vision Encoder:from pixels to features。 预训练并且冻结的NFNet&#xff…

kindeditor The method toJSONString() is undefined for the type JSONObject

kindeditor 插件上传文件出错的 json_simple-1.1.jar 也不知道是多老的项目,多老的包了,稀有东西

助力智能人群检测计数,基于DETR(DEtectionTRansformer)开发构建通用场景下人群检测计数识别系统

在一些人流量比较大的场合,或者是一些特殊时刻、时段、节假日等特殊时期下,密切关注当前系统所承载的人流量是十分必要的,对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段,本文的主要目的是想要…

Liteos移植_STM32_HAL库

0 开发环境 STM32CubeMX(HAL库)keil 5正点原子探索者STM32F4ZET6LiteOS-develop分支 1 STM32CubeMX创建工程 如果有自己的工程,直接从LiteOS源码获取开始 关于STM32CubeMX的安装,看我另一篇博客STM32CubeMX安装 工程配置 创建新工程 选择芯片【STM32F…

C++:第九讲前缀和与差分

Everyday English Your optimal career is simply this: Share the real you with physical world through th e process of creative self-expression. 你的最佳职业很简单,就是这样:通过创造性自我表达的途径和世界分享真实的你。 前言 这节课带你们…

Codeforces Round 862 (Div. 2)

Problem - A - Codeforces AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; const int N1e310; int a[N]; int n; void solve() {cin>>n;int ans0;for(int i1;i<n;i) cin>>a[i],ans^a[i];if(n%21){for(in…

3.[BUUCTF HCTF 2018]WarmUp1

1.看题目提示分析题目内容 盲猜一波~ &#xff1a; 是关于PHP代码审计的 2.打开链接&#xff0c;分析题目 给你提示了我们访问source.php来看一下 大boss出现&#xff0c;开始详细手撕~ 3.手撕PHP代码&#xff08;代码审计&#xff09; 本人是小白&#xff0c;所以第一步&…

Linux Centos-7.5_64bit 等保测评

一、新增用户 新增test用户 useradd test 设置密码 passwd 修改test的密码 passwd test 修改/etc/sudoers文件&#xff0c;找到下面一行&#xff0c; /etc/sudoers test ALL(ALL) ALL 保存是出现 E45: readonly option is set (add ! to override) 解决办法&#xff…

arduino舵机练习

接地线gnd和电源线5v&#xff1b;信号线链接任意数字针脚 // C code // #include <Servo.h> //引入舵机库Servo servo_2; //定义舵机void setup() {servo_2.attach(2, 500, 2500);/* servo_2.attach(2, 500, 2500) servo_2 对象的一个方法调用&#xff0c;其中包含…

【Amazon 实验①】使用Amazon WAF做基础 Web Service 防护

文章目录 一、实验介绍二、实验环境准备三、验证实验环境四、Web ACLs 配置 & AWS 托管规则4.1 Web ACLs 介绍4.2 Managed Rules 托管规则4.3 防护常见威胁类型&#xff08;sql注入&#xff0c;XSS&#xff09;4.4 实验步骤4.4.1 创建Web ACL4.4.2 测试用例4.4.3 测试结果4…

【Spring实战】配置多数据源

文章目录 1. 配置数据源信息2. 创建第一个数据源3. 创建第二个数据源4. 创建启动类及查询方法5. 启动服务6. 创建表及做数据7. 查询验证8. 详细代码总结 通过上一节的介绍&#xff0c;我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中&#xff0c;…

Linux的/proc/self/学习

文章目录 /proc目录/proc/self的使用 在做SSTI模板注入的CTF题中&#xff0c;发现有师傅提到可以用/proc/self这个目录获取flag&#xff0c;所以也来学习一波主要参考. (我才知道&#x1f601;&#x1f601;&#x1f601;)可以通过/proc/$pid/来获取指定进程的信息&#xff0c…

uniapp uview 页面多个select组件回显处理,默认选中

<view class"add-item column space-around" click"selectClick(1)"><text class"w-s-color-3 f-28">商品分类</text><view class"w-100 space-between"><!-- 第一个参数为你的单选数组&#xff0c;第二个…

Laravel框架使用phpstudy本地安装的composer用Laravel 安装器进行安装搭建

一、首先需要安装Laravel 安装器 composer global require laravel/installer 二、安装器安装好后&#xff0c;可以使用如下命令创建项目 laravel new sys 三、本地运行 php artisan serve 四、 使用Composer快速安装Laravel5.8框架 安装指定版本的最新版本&#xff08;推荐&a…

Kibana下载与安装

Kibana 是一个免费且开放的用户界面&#xff0c;能够让你对 Elasticsearch 数据进行可视化&#xff0c;并 让你在 Elastic Stack 中进行导航。 你可以进行各种操作&#xff0c;从跟踪查询负载&#xff0c;到理解请求如 何流经你的整个应用&#xff0c;都能轻松完成。 下载地址&…