单例模式的类和静态方法的类的区别和使用场景 - 指南

news/2025/10/7 12:03:14/文章来源:https://www.cnblogs.com/tlnshuju/p/19128338

单例模式的类和静态方法的类的区别和使用场景 - 指南

2025-10-07 12:02  tlnshuju  阅读(0)  评论(0)    收藏  举报

单例模式的类和使用静态方法的类在功能上都能提供全局访问的能力,但它们在实现方式、特性和使用场景上存在差异,下面从多个方面进行比较:

1. 实现方式

单例模式的类

单例模式确保一个类只有一个实例,并提供一个全局访问点。通常通过私有构造函数、静态实例变量和工厂构造函数来实现。

class AudioPlayerUtil {
static late final AudioPlayerUtil _instance = AudioPlayerUtil._internal();AudioPlayerUtil._internal();factory AudioPlayerUtil() => _instance;// 其他方法和属性
}
静态方法的类

静态方法的类将所有方法和属性都声明为静态的,不需要创建实例即可调用。

class AudioPlayerUtil {
static AudioPlayer? _audioPlayer;static Future<void> playAudio(String audioPath) async {
// 方法实现
}
}

2. 内存管理

单例模式的类

单例对象在首次使用时创建,并且在整个应用生命周期内存在。如果单例对象占用大量资源,可能会导致内存浪费。不过,单例对象可以在适当的时候进行资源释放,如调用 dispose 方法。

静态方法的类

静态成员在类加载时就被初始化,并且一直存在于内存中。即使不使用这些静态成员,它们也会占用内存。

3. 可测试性

单例模式的类

单例对象可以被模拟和替换,方便进行单元测试。可以通过依赖注入的方式将单例对象注入到需要使用的类中,从而在测试时使用模拟对象替代真实的单例对象。

静态方法的类

静态方法难以进行模拟和替换,因为它们是类级别的,无法通过依赖注入的方式进行替换。这会给单元测试带来一定的困难。

4. 继承和多态

单例模式的类

单例类可以被继承,子类可以重写父类的方法,实现多态。

class ExtendedAudioPlayerUtil extends AudioPlayerUtil {
// 重写父类方法
}
静态方法的类

静态方法属于类,不能被子类重写,因此无法实现多态。

5. 状态管理

单例模式的类

单例对象可以拥有实例变量,能够存储和管理状态。不同的方法可以访问和修改这些实例变量。

class AudioPlayerUtil {
static late final AudioPlayerUtil _instance = AudioPlayerUtil._internal();int playCount = 0;AudioPlayerUtil._internal();factory AudioPlayerUtil() => _instance;void play() {
playCount++;
// 播放逻辑
}
}
释放单例对象及资源
/// 释放单例对象资源并重置单例实例
static void releaseSingleton() {
if (_instance != null) {
playCount = 0;
_instance = null;
}
}

在需要的时候释放单例对象的资源,可以避免内存泄漏。

静态方法的类

静态方法只能访问静态变量,静态变量在类加载时初始化,并且所有实例共享同一个静态变量。静态方法难以管理复杂的状态。

6. 使用场景

单例模式的类

适用于需要全局唯一实例,并且需要管理状态和资源的场景,如数据库连接、日志记录器等。

静态方法的类

适用于提供工具方法,不依赖于实例状态的场景,如数学计算、字符串处理等。

综上所述,单例模式的类更灵活,适合需要管理状态和资源的场景,而静态方法的类更简单,适合提供无状态的工具方法。

单例模式的类在应用中是否仅有一个实例测试代码

void main() {
AudioPlayerUtil player1 = AudioPlayerUtil();
AudioPlayerUtil player2 = AudioPlayerUtil();
print(identical(player1, player2)); // 输出: true,表明 player1 和 player2 是同一个实例
}

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

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

相关文章

LGP9871 [NOIP 2023] 天天爱打卡 学习笔记

LGP9871 [NOIP 2023] 天天爱打卡 学习笔记 Luogu Link 前言 经典题了属于是。写 \(\texttt{LGP12581}\) 时特此来回顾。 当年是有多么糖啊。希望现在只有棒棒没有糖吧。 题意简述 小 \(\text{T}\) 同学非常热衷于跑步。…

【OpenGL ES】Windows上OpenGL环境搭建

1 前言 ​ Windows 的图形 API 是 DirectX,对 OpenGL 的支持比较有限(系统自带的 opengl32.dll 仅支持 OpenGL 1.1 版本),因此在 Windows 上进行OpenGL 开发时,通常需要借助第三方库或工具来支持更高版本的 Op…

虚拟现实教育终端科技方案——基于EFISH-SCB-RK3588的全场景国产化替代

虚拟现实教育终端科技方案——基于EFISH-SCB-RK3588的全场景国产化替代pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

强化学习系统性学习笔记(二):策略优化的理论基础与算法实现

强化学习系统性学习笔记(二):策略优化的理论基础与算法实现策略优化的理论基础与算法实现 3.2 REINFORCE: 最早的策略梯度算法 在完成策略梯度定理的推导后,我们获得了梯度的理论形式: \[\nabla_\theta J(\pi_\thet…

惠州做公司网站广州软件开发培训班

RK3568测试tdd 一、门禁取包二、烧录三、跑tdd用例四、查看结果参考资料 一、门禁取包 右键复制链接&#xff0c;粘贴下载&#xff1b;解压到文件夹&#xff1b; 二、烧录 双击\windows\RKDevTool.exe打开烧写工具&#xff0c;工具界面击烧写步骤如图所示&#xff1a; 推荐…

完整教程:WordPress 6.5版本带来的新功能

完整教程:WordPress 6.5版本带来的新功能pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

网站维护的具体问题wordpress 代理插件

需求&#xff1a;点击button按钮&#xff0c;录入成功后&#xff0c;页面上的input框自动聚焦&#xff0c;快速进行下一次录入&#xff0c;提高效率 开始尝试了几种方法都没有成功 一、首先想到的用vue指令 v-focus&#xff0c;然而没有成功 <Input v-model"book.isbnO…

手机网站判断跳转代码怎么写医院建设网站与托管

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

微信开发框架/WTAPI框架

微信开发框架/WTAPI框架,个人微信接口开发,个微API,个人二次开发微信API,个人微信号二次开发api协议/微信个人号开发API接口 WTAPI框架,是完整的第三方服务平台,并基于IPAD协议8.0.37开发出的最新个微API服务框架…

免费开源Umi-OCR,离线采用,批量精准!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025连接器厂家权威推荐榜:防水/m12防水/m8/防水3芯/防水t型三通/防水线束线缆/防水包胶连接器实力制造与创新技术深度解析

在工业4.0和智能制造快速发展的今天,连接器作为电子设备中不可或缺的基础元件,其技术水平和产品质量直接影响着整个电子系统的可靠性和性能。随着5G通信、新能源汽车、工业自动化等新兴领域的蓬勃发展,全球连接器市…

STM32外部中断(EXTI)以及旋转编码器的简介 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

神经网络中的梯度消失与梯度爆炸 - 实践

神经网络中的梯度消失与梯度爆炸 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

[数学 - 正态分布]

您提到的“中间隆起的图”很可能就是正态分布(Normal Distribution)的图形,也叫钟形曲线(Bell Curve)。 在统计学和金融学中,这个图形和回归分析、标准差一样重要,因为它是我们理解风险、波动性和概率的基础。隆…

Withdraw x Failure《一元微积分》讲义习题

习题 \(1.1\): 第 \(1\) 题: \(1.1.7\):\(\N\) 上的加法是对乘法满足分配律:即对任意 \(m,n,k\in\N\),\((m+n)\cdot k=m\cdot k+n\cdot k\)。 证明:对 \(k\) 做数学归纳。 令 \(A=\{k\in\N|\forall m,n\in \N,(m…

状态压缩 DP

“状态压缩动态规划”中的状态,通常与集合相关联。集合本身具有确定性、互异性和无序性 3 个性质,这也就决定了集合只关心每个元素的存在状态,而这通常可以使用 0 或者 1 表示存在或者不存在。例如,有 8 个物品,对…

QGIS开发笔记(四):QgsRasterLayer加载Cesium二维地图的瓦片地图数据到QGIS

前言地图引擎加载瓦片地图是基本操作,本篇对qgis添加图片瓦片地图。 Demo 专业名词波段波段(Band) 是指栅格数据中具有特定波长范围的信息层,类似于数字图像中的 “通道”。它是栅格数据(尤其是遥感影像)的核心组…

基于 Chrome 浏览器扩展的Chroma简易图形化界面 - 实践

基于 Chrome 浏览器扩展的Chroma简易图形化界面 - 实践2025-10-07 11:28 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; d…

建筑设计作品展示网站wordpress免费相册

在本篇博客中&#xff0c;作者将会讲解类与对象的最后一篇。 一.再谈构造函数 在类与对象&#xff08;上篇&#xff09;中&#xff0c;我们讲到了构造函数&#xff0c;其实构造函数就是给每个成员变量进行赋值&#xff01;&#xff01;&#xff01; 仅仅只是赋值而已&#xf…

苍南县网站集约化建设西安网站优化排名案例

原文 http://www.eoeandroid.com/thread-274556-1-1.html 【初识Github】 首先让我们大家一起喊一句“Hello Github”。YEAH!就是这样。Git是一个分布式的版本控制系统&#xff0c;最初由Linus Torvalds编写&#xff0c;用作Linux内核代码的管理。在推出后&#xff0c;Git在其…