C# 单例模式

单例模式介绍

单例模式只允许被其自身实例化一次,且向外部提供了一个访问该实例的接口。

通常来说,单例对象进行实例化时一般不带参数,因为如果不同的实例化请求传递的参数不同的话会导致问题的产生。

 

单例模式主要特点

  1. 全局唯一性:单例模式确保一个类只有一个实例,无论多少次尝试创建该类的实例,都只会返回第一次创建的实例。这提供了一种全局访问点,使得在程序的任何地方都可以访问和使用这个唯一的实例。

  2. 线程安全性:在多线程环境中,单例模式需要确保实例的创建是线程安全的,以防止多个线程同时创建多个实例。这通常通过同步机制(如双重检查锁定)来实现。

  3. 延迟初始化(懒加载)或预初始化(饿加载):单例模式可以通过不同的实现方式来实现实例的创建时机。懒加载(懒汉式)意味着实例在第一次被请求时创建,而预初始化(饿汉式)则意味着实例在类加载时就已经创建。懒加载可能带来线程安全的问题,而预初始化则不存在这个问题,但可能会浪费一些资源,因为实例可能在程序执行过程中从未被使用。

  4. 封装性:单例模式将类的实例化过程封装在类内部,隐藏了实例化的细节,对外只提供一个全局的访问点。这有助于隐藏实现细节,并提供了一个统一的接口来获取类的实例。

  5. 限制实例化:单例模式通过私有构造函数和静态方法限制了类的实例化过程,确保只有单例类自己能够创建实例,外部代码无法直接通过new关键字来创建新的实例。

  6. 简化配置:在某些场景中,单例模式可以简化对象的配置和管理。例如,当某个类需要访问数据库连接池、日志记录器或其他共享资源时,可以通过单例模式来管理这些资源的唯一实例,避免资源的重复创建和浪费。

需要注意的是,虽然单例模式在某些情况下很有用,但它也可能导致代码难以理解和维护。过度使用单例模式可能导致代码结构混乱、依赖关系复杂以及测试困难。因此,在使用单例模式时应该谨慎考虑,并确保它真正符合你的设计目标和需求。

 

单例模式常见使用方式

饿汉式(静态初始化)

在这种模式下,Singleton类在加载时就会立即创建并初始化一个静态实例,所以它是线程安全的,但可能造成资源浪费,如果程序从未使用到该实例。

public sealed class Singleton
{private static readonly Singleton instance = new Singleton();// 将构造函数设为私有,防止外部直接实例化private Singleton() {}// 提供一个公共的静态属性来获取实例public static Singleton Instance{get { return instance; }}
}

 

懒汉式(线程不安全)

这种实现不是线程安全的,当多线程同时访问Instance属性并发现instance为空时,可能会创建多个实例。

public sealed class Singleton
{private static Singleton instance;private Singleton() {}public static Singleton Instance{get{if (instance == null){instance = new Singleton();}return instance;}}
}

懒汉式(双重检查锁定 - 线程安全)

双重检查锁定解决了线程安全问题,在多线程环境下确保了只有一个实例被创建。volatile关键字确保了多线程环境下的可见性和有序性。

public sealed class Singleton
{private static volatile Singleton instance;private static object syncRoot = new Object();private Singleton() {}public static Singleton Instance{get{if (instance == null){lock (syncRoot){if (instance == null){instance = new Singleton();}}}return instance;}}
}

静态内部类(线程安全且延迟加载)

使用静态内部类的方式实现单例模式既保证了线程安全,又实现了延迟加载,即当首次访问Singleton.Instance时才会真正实例化对象。

public sealed class Singleton
{private Singleton() {}public static Singleton Instance{get{return Nested.instance;}}private class Nested{// 静态初始化只会在第一次调用Nested.instance时发生internal static readonly Singleton instance = new Singleton();}
}

枚举模式(最简洁、线程安全)

如果单例可以接受无参数构造函数,并且不需要额外的方法和状态,可以通过枚举实现单例模式,这种方式是线程安全的并且自动处理序列化问题。不过它适用于非常简单的场景,因为枚举不能扩展其他功能或行为。

public enum Singleton
{Instance
}

 

单例模式总结

在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。

1.资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。

2.控制资源的情况下,方便资源之间的互相通信。如线程池等。

3.一般情况下,我们并不需要实现完全懒汉式,除非构造初始化执行了某些费时的工作。因此一般的,我们使用显式的静态构造函数就能够适用。

 

参考地址:

https://www.cnblogs.com/mingnianjiehunba/p/17669212.html

https://www.jb51.net/article/261666.htm

其他等 

 

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

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

相关文章

提升物流效率,快递平台实战总结与分享

随着电商行业的蓬勃发展,物流配送服务变得愈发重要。快递平台作为连接电商企业和消费者的桥梁,扮演着至关重要的角色。本篇博客将分享快递平台实战经验,总结关键要点,帮助物流从业者提升物流效率、优化服务质量。 ### 快递平台实…

汽车网络基础知识 要点

在以太网开发中,常常会听到一些专业名词,例如PHY,MAC,MII,switch,下面是解释 PHY PHY 是物理接口收发器,它实现物理层。包括 MII/GMII (介质独立接口) 子层、PCS (物理编码子层) 、PMA (物理介…

SQLiteC/C++接口详细介绍之sqlite3类(十四)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(十三) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(十五) 43.sqlite3_preupdate_hook sqlite3_preup…

PHP获取并分析过期删除.cn域名3-5数字(无4非0开)/2-4字母(声母)/三杂等品类域名

用途:获取分析最近过期删除.cn域名中3-5数字(无4非0开)/2-4字母(声母)/三杂等品类域名 先创建rec文件夹,用于按天缓存域名列表(不自动创建哦) 推荐宝塔灯自带的定时任务访问本文件网址&#xff0c;每早5-6点执行 获取两天后删除的cn域名名单并提取几个有价值类目的域名 <…

什么可以让你快速穿越低谷?

1. 变环境 当我们对当前生活状态感到彻底失望&#xff0c;当我们看透了人世间的冷暖&#xff0c;见证了人性的撕裂与拉扯&#xff0c;就会意识到需要改变环境。这可能包括搬离现居之地&#xff0c;寻找新的斗争之地。就像寻找宝玉发光之地一样&#xff0c;我们需要找到能让自己…

基于springboot的高校化学试剂仓储管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

VMware NSX Advanced Load Balancer (NSX ALB) 22.1.6 - 多云负载均衡平台

VMware NSX Advanced Load Balancer (NSX ALB) 22.1.6 - 多云负载均衡平台 应用交付&#xff1a;多云负载均衡、Web 应用防火墙和容器 Ingress 服务 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-nsx-alb-22/&#xff0c;查看最新版。原创作品&#xff0c;转载请…

194 基于matlab的日历GUI制作

基于matlab的日历GUI制作&#xff0c;可实时显示当前的日期和时间&#xff0c;精确到秒。非常漂亮&#xff0c;也很基础&#xff0c;学习GUI的不错程序&#xff0c;程序已调通&#xff0c;可直接运行。 194 matlab 日历制作 GUI可视化 - 小红书 (xiaohongshu.com)

sqlplus设置提示符

作为DBA&#xff0c;需要管理好多数据库&#xff0c;经常会有一台服务器安装多个oracle实例的情况&#xff0c;为避免误操作实例&#xff0c;我们需要在执行sqkplus前&#xff0c;先通过$ echo $ORACLE_SID或 SQL>select name from v$database查看当前实例&#xff0c;这样难…

前端小白的学习之路(CSS3 一)

提示&#xff1a;CSS3 是 Cascading Style Sheets&#xff08;层叠样式表&#xff09;的第三个主要版本&#xff0c;引入了许多新的特性和增强功能&#xff0c;用于设计和布局网页。本章记录CSS3新增选择器&#xff0c;盒子模型。 目录 一、C3新增选择器 1) 属性选择器 1.[c…

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习&#xff1a;计时和文件处理-给算法计时-上机代码 上机代码&#xff1a; # 基本扩展模块训练 给算法计时 def factorial(number): # 自定义一个计算阶乘的函数i 1result 1 # 变量 result 用来存储每个数的阶…

小结:Node.js Express VS Koa

Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架&#xff0c;主要基于 Connect 中间件&#xff0c;并且自身封装了路由、视图处理等功能&#xff0c;使用人数众多。 Koa 是 Express 原班人马基于 ES6 新特性重新开发的框架&#xff0c;主要基于 co 中间件&am…

RTP 控制协议 (RTCP) 反馈用于拥塞控制

摘要 有效的 RTP 拥塞控制算法&#xff0c;需要比标准 RTP 控制协议(RTCP)发送方报告(SR)和接收方报告(RR)数据包提供的关于数据包丢失、定时和显式拥塞通知 (ECN) 标记的更细粒度的反馈。 本文档描述了 RTCP 反馈消息&#xff0c;旨在使用 RTP 对交互式实时流量启用拥塞控制…

MongoDB数据备份与迁移

MongoDB数据备份与迁移 参考链接&#xff1a; https://www.cnblogs.com/you-men/p/14675290.html#_label2https://docs.mongoing.com/guan-li/mongodb-backup-methods#shi-yong-mongodump-bei-fenhttps://www.cnblogs.com/dbabd/p/13259147.html MongoDB备份工具简介 mongo…

Rust 的 Arc<Mutex<T>> 的用法示例源代码

在 Rust 中&#xff0c;Arc<Mutex<T>> 是一种组合类型&#xff0c;它结合了 Arc&#xff08;原子引用计数&#xff09;和 Mutex&#xff08;互斥锁&#xff09;。Arc 用于在多个所有者之间共享数据&#xff0c;而 Mutex 用于确保在任意时刻只有一个线程可以访问被保…

js使用canvas实现图片鼠标滚轮放大缩小拖拽预览,显示像素坐标,显示像素值

html代码 todo 实现画矩形框&#xff0c;圆形roi <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title&…

单元测试开发必不可少的一项工作,C#怎么来写单元测试

单元测试在开发过程中非常重要&#xff0c;写单元测试有几个重要的理由&#xff1a; 确保代码质量和稳定性&#xff1a; 单元测试可以帮助你验证代码的正确性。通过编写测试用例&#xff0c;你可以确保代码按照预期的方式工作&#xff0c;并且在进行重构或修改时不会破坏原有的…

JMeter 面试题及答案整理,最新面试题

JMeter中如何进行性能测试的规划和设计&#xff1f; 进行JMeter性能测试的规划和设计主要遵循以下几个步骤&#xff1a; 1、确定测试目标&#xff1a; 明确性能测试的目的和目标&#xff0c;比如确定要测试的系统性能指标&#xff08;如响应时间、吞吐量、并发用户数等&#…

zookeeper快速入门一:zookeeper安装与启动

本文是zookeeper系列之快速入门中的第一篇&#xff0c;欢迎大家观看与指出不足。 写在前面&#xff1a; 不影响教程&#xff0c;笔者安装zookeeper用的是WSL(windows下的linux子系统&#xff09;&#xff0c;当然你想直接在windows上用zookeeper也是可以的。 如果你也想用ws…

怎么判断发票扫描OCR软件好用不好用?

发票扫描OCR&#xff08;Optical Character Recognition&#xff09;是一种将纸质发票上的文字、数字等信息转化为可编辑的文本格式的技术。在现代企业中&#xff0c;随着数字化转型的推进&#xff0c;发票扫描OCR技术变得越来越重要。然而&#xff0c;面对市场上众多的发票扫描…