设计模式概述之单例模式(四)

news2024/11/17 20:35:10

很多小伙伴,不知道设计模式是什么?

通常我们所说的设计模式是一种设计方案,是前人留下的经验及最佳实践。

想要学习设计模式,至少要把面向对象的基本结构全部了解。

设计模式,是建立在一定基础上的思维训练。

学习设计模式,要有面临痛苦的决心。

学会设计模式,对解决问题及对程序理解有更高层次的认识。

如果有这样的决心,那么下面我们就认识一下,它的真面目。


常说的设计模式是23种设计模式,分为3大类:

创建型模式5种:工厂方法、抽象工厂、单例、建造者、原型

结构型模式7种:适配器、代理、桥接、装饰者、外观、享元、组合

行为型模式11种:模板方法、解释器、策略、观察者、迭代器、职责链、命令、备忘录、状态、访问者、中介者。

当然有一部分模式中,还有一些小的变化,在未来的持续更新中,我们会一一列举,并以代码为主,去学习设计模式。


上次咱们说了“抽象工厂模式”。今天咱们来说“单例模式”。

单例模式-属于创建类型的一种常用的软件设计模式。单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。

单例模式-要点

在Java语言中,对于单例模式的设计给出了如下要点:

某个类只能有一个实例。

它必须自行创建这个实例。

它必须自行向整个系统提供这个实例。

具体体现:

单例模式的类只提供私有的构造函数。

类定义中含有一个该类的静态私有对象。

该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对

“单例模式”从字面上理解,主要是“单一实例”。也就是说,无论谁调用,无论在哪里调用,始终保持只有一个实例。

重点步骤:

  1. 私有化构造函数方法,目的是不能让外部直接实例化对象。
  2. 构建对外方法,控制外部调用。
  3. 始终保持一个实例化对象调用,要用到静态空间。

看到上面的步骤,是不是觉得核心思路和“属性封装”的思路类似?

单例模式主要分类:

  • 饿汉模式

 

 

“饿汉模式”主要意思是,利用静态变量实例化对象,利用方法返回当前所在类的静态变量。

而静态成员变量随着类的信息在程序结束前始终驻留于内存中,故而称为“饿汉”。如果单线程使用频繁用“饿汉模式”。

  • 懒汉模式

 

 

“懒汉模式”主要意思是,利用静态变量为空,利用方法判断是否为空,如果为空就实例化对象,不为空就返回当前对象。从而保持始终访问同一个对象。

“懒汉”不打不动,不调用没有对象,调用一次后,始终实用一个对象。无愧于“懒”这个字。通常单线程程序,用“懒汉模式”。

  • 双重检索模式

“双重检索模式”是针对多线程环境的线程安全性,从懒汉模式中演变而来,实际上就是懒汉模式的升级,将懒汉模式的方法中加入“synchronized”。 

 

 

“双检索单例模式”的写法变化:在“synchronized”之外和使用“synchronized”里都进行了“非空检查”,从而保证多线程环境下,始终保持一个实例化对象的建立。

很多小伙伴们记住了单例模式,但是不知道在哪里能用的到单例模式。就此问题说一句“了解其功能自然直到用在哪里”。

咱们假定一个场景需求:学生会给学生放电影。

1、在放电影的过程中,始终有一台放映机在放映。

2、电影要一个一个播放。

3、学生操作放映机,学生可以换,放映机不能换。

 

控制一个功能类在整体的程序中,始终保持一个实例化对象使用。遇见类似“放映机”这种类的情况,会将其设置为单例模式使用。


单例模式优缺点

优点:

你可以保证一个类只有一个实例。

你获得了一个指向该实例的全局访问节点。

仅在首次请求单例对象时对其进行初始化。

缺点:

违反了单一职责原则。 该模式同时解决了两个问题。

单例模式可能掩盖不良设计, 比如程序各组件之间相互了解过多等。

该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象。

单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。 由于单例类的构造函数是私有的, 而且绝大部分语言无法重写静态方法, 所以你需要想出仔细考虑模拟单例的方法。 要么干脆不编写测试代码, 或者不使用单例模式。

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

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

相关文章

喜报 | 中关村发来贺电

2022年12月14日,由中关村金融科技产业发展联盟、中关村互联网金融研究院举办的“中关村金融科技系列活动——2023第十届中关村金融科技论坛年会暨2022“光大杯”中关村番钛客金融科技国际创新大赛颁奖典礼”已圆满落幕。本次会议为建设金融科技中心,共建…

【Pintos】实现自定义 UserProg 系统调用

💭 写在前面:本文讲解的内容不属于 Pintos 的 Project 项目,而是关于 userprog 如何添加系统调用的,学习如何额外实现一些功能到系统调用中以供用户使用。因为涉及到 src/example 下的Makefile 的修改、lib 目录下 syscall-nr 系统…

搜索二叉树详解

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸 文章目录一、搜索二叉树框架二、搜索二叉树概念三、搜索二叉树操作①Erase②Find递归③Insert递归④Erase递归,比Erase更简洁⑤析构函数⑥…

unity学习笔记--day01

今天学习制作了一个简单的抽卡功能,学习结束后目录结构如下: .mate文件是unity生成的配置文件,不用管 制作第一张卡片 创建一个空物体,改名为Card。 在Card下挂载以下UI组件: 编写数据脚本并挂载,unity采用…

Nginx教程(4)—Keepalived

文章目录4.1 高可用集群架构Keepalived双机主备原理4.2 安装Keepalived4.3 Keepalived核心配置文件4.4 Keepalived实现双主机主备高可用测试4.5 高可用集群架构Keepalived双主热备原理Nginx教程一 Nginx教程二 Nginx教程三 4.1 高可用集群架构Keepalived双机主备原理 我们知道…

【计算机毕业设计】78.汽车租赁系统源码

一、系统截图(需要演示视频可以私聊) 目 录 摘 要 前 言 第1章 概述 1.1 研究背景 1.2 研究目的 1.3 研究内容 第二章 开发技术介绍 2.1 Java技术 2.2 Mysql数据库 2.3 B/S结构 2.4 SSM框架 第三章 系统分析 3.1 可行性分析 3.1.1 技术…

UnrealUBlueprintAsyncActionBase的使用

实现异步调用,之前我们介绍过一种FLatentActionInfo的方法,还有另外一种UBlueprintAsyncActionBase方法,可以实现异步节点,用于异步监听然后进行回调。按照如下步骤进行使用,我们同样以Delay一定帧数,并每帧…

面对新技术,必须找到与其发展相辅相成的长期主义的方法

从Meta股价的一路走低到扎克伯格发布的头显并不被用户买账,Facebook全力拥抱Meta正在经历一场过山车。   扎克伯格和他所带领下的Meta遭遇到的如此多的困境和难题,越来越多地让我们开始相信:所谓的元宇宙并非是一蹴而就的,它是一…

【云原生 Kubernetes】基于 Minikube 搭建第一个k8s集群

一、前言 对于k8s来说,搭建方式有多种,如果是生产环境,一般来说,至少需要3台节点确保服务的高可用性,常用的搭建方式列举如下(提供参考): kubeadm搭建(推荐) …

postman测试环境的创建及发送请求方式

目录 一、创建工作环境 1、打开postman,点击工作区 2、点击新建 3、添加名字,点击创建 4、工作区可以自由切换工作区 5、点击创建发送请求 6、更换请求方式 7、保存测试 二、测试发送请求,使用的时候服务一定要启动 1、普通传参&…

C++ 类型转换

目录 C语言中的类型转换 为什么C需要四种类型转换 C:命名的强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配&#xff0c…

信息学奥赛一本通——1163:阿克曼(Ackmann)函数

文章目录1163:阿克曼(Ackmann)函数【题目描述】【输入】【输出】【输入样例】【输出样例】分析代码1163:阿克曼(Ackmann)函数 时间限制:1000ms内存限制:65536KB提交数:24804通过数:20247时间限制: 1000 ms 内存限制: 65536 KB 提交数: 24804 通过数: 202…

第三十章 linux-模块的文件格式与EXPORT_SYMBOL的实现

第三十章 linux-模块的文件格式与EXPORT_SYMBOL的实现 文章目录第三十章 linux-模块的文件格式与EXPORT_SYMBOL的实现模块的文件格式EXPORT_SYMBOL的实现模块的文件格式 以内核模块形式存在的驱动程序,比如demodev.ko,其在文件的数据组织形式上是ELF&am…

数据结构---快速排序

快速排序分治法思想基准元素的选择元素交换双边循环法JAVA实现单边循环法JAVA实现快速排序也是从冒泡排序演化而来使用了 分治法(快的原因)快速排序和冒泡排序共同点:通过元素之间的比较和交换位置来达到排序的目的。 快速排序和冒泡排序不同…

JavaWeb核心:HTTPTomcatServlet

HTTP 概念: Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 HTTP-请求数据格式 HTTP-响应数据格式 响应状态码的大的分类 常见的响应状态码 Tomcat 简介 概念: Tomcat是Apache 软件基金会一个核心项目&#…

【云原生】Prometheus 自定义告警规则

文章目录一、概述二、告警实现流程三、告警规则1)告警规则配置1)监控服务器是否在线3)告警数据的状态四、实战操作1)下载 node_exporter2)启动 node_exporter3)配置Prometheus加载node_exporter4&#xff0…

这样也可以让图像正向扩散

🍿*★,*:.☆欢迎您/$:*.★* 🍿 怎样的扩散取决于b是不是随机噪声 是随机噪声 则是扩散模型 如stable diffision 如果是非噪声则是方向模型 方向模型是指 在已知几个连续的输入 后可以通过模型的辅助预测扩散的方向 而 stable diffision 是通过预测反扩散方向 本质就…

VS2017中OpenCV编程插件Image Watch安装和使用介绍

安装 下载适合vs2017最新版本的Image Watch(ImageWatch.vsix),下载地址 安装ImageWatch,双击ImageWatch.vsix进行安装即可; 使用 打开一个OpenCV工程,在Debug下设置断点,通过view -> other windows -> Image W…

基于51单片机宠物自动投料喂食器控制系统仿真设计( proteus仿真+程序+讲解视频)

基于51单片机宠物自动投料喂食器控制系统仿真设计( proteus仿真程序讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0029 视频讲解 基于51单片机的宠物自动投料喂食器控制系统proteu…

数据结构—最小生成树

目录 一、生成树 二、最小生成树(代价最小树) 三、求最小生成树 1、Prim算法(普里姆) 2.Kruskal 算法(克鲁斯卡尔) 3.Prim算法和Kruskal算法对比 一、生成树 连通图的生成树是包含图中全部顶点的一个…