C# 设计模式之单例模式归纳总结

发布时间 - 2026-01-11 00:45:51    点击率:

优缺点

 优点:

一、实例控制

单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。

二、灵活性

因为类控制了实例化过程,所以类可以灵活更改实例化过程。

缺点:

一、开销

虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。

二、可能的开发混淆

使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

三、对象生存期

不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用 

C#

保证一个类仅有一个实例,并提供一个访问它的全局访问点

实现要点

Singleton模式是限制而不是改进类的创建。

Singleton类中的实例构造器可以设置为Protected以允许子类派生。

Singleton模式一般不要支持Icloneable接口,因为这可能导致多个对象实例,与Singleton模式的初衷违背。

Singleton模式一般不要支持序列化,这也有可能导致多个对象实例,这也与Singleton模式的初衷违背。

Singleton只考虑了对象创建的管理,没有考虑到销毁的管理,就支持垃圾回收的平台和对象的开销来讲,我们一般没必要对其销毁进行特殊的管理。

理解和扩展Singleton模式的核心是"如何控制用户使用new对一个类的构造器的任意调用"。

可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。

优点

实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例

灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程

缺点

开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题,上面的五种实现方式中已经说过了。

可能的开发混淆:使用 singleton 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

对象的生存期:Singleton 不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于 .NET Framework 的语言),只有 Singleton 类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除

对象实例,但这样会导致 Singleton 类中出现悬浮引用。

适用性

当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

代码示例:

双重锁机制

namespace Singleton
{
public class Singleton
{
//定义一个私有的静态全局变量来保存该类的唯一实例
private static Singleton singleton;
//定义一个只读静态对象
//且这个对象是在程序运行时创建的
private static readonly object syncObject = new object();
///
/// 构造函数必须是私有的
/// 这样在外部便无法使用 new 来创建该类的实例
///
private Singleton()
{}
///
/// 定义一个全局访问点
/// 设置为静态方法
/// 则在类的外部便无需实例化就可以调用该方法
///
///
public static Singleton GetInstance()
{
//这里可以保证只实例化一次
//即在第一次调用时实例化
//以后调用便不会再实例化
//第一重 singleton == null
if (singleton == null)
{
lock (syncObject)
{
//第二重 singleton == null
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
}
}

希望本文对您有所帮助


# C#  # 设计模式之单例模式  # 单例模式总结  # C#实现单例模式的几种方法总结  # 解析C#设计模式之单例模式  # 关于c#中单例模式的一些问题  # c# 单例模式的实现方法  # c#设计模式之单例模式的实现方式  # 浅谈C#单例模式的实现和性能对比  # C#单例模式(Singleton Pattern)详解  # c#单例模式(Singleton)的6种实现  # C# 设计模式系列教程-单例模式  # c# 单例模式的实现  # 开发人员  # 自己的  # 都要  # 多个  # 子类  # 类中  # 这也  # 可以通过  # 此类  # 因为它  # 发现自己  # 设置为  # 源代码  # 是否存在  # 应用程序  # 有一个  # 类库  # 无法访问  # 内存管理  # 几个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: zabbix利用python脚本发送报警邮件的方法  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何登录建站主机?访问步骤全解析  Linux安全能力提升路径_长期防护思维说明【指导】  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  javascript日期怎么处理_如何格式化输出  javascript中闭包概念与用法深入理解  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  网易LOFTER官网链接 老福特网页版登录地址  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  使用spring连接及操作mongodb3.0实例  Laravel如何升级到最新版本?(升级指南和步骤)  JavaScript中的标签模板是什么_它如何扩展字符串功能  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  如何在新浪SAE免费搭建个人博客?  如何在阿里云虚拟主机上快速搭建个人网站?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  清除minerd进程的简单方法  如何有效防御Web建站篡改攻击?  在线制作视频网站免费,都有哪些好的动漫网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  bing浏览器学术搜索入口_bing学术文献检索地址  如何自定义建站之星网站的导航菜单样式?  如何确保FTP站点访问权限与数据传输安全?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  网页设计与网站制作内容,怎样注册网站?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Laravel观察者模式如何使用_Laravel Model Observer配置  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Android GridView 滑动条设置一直显示状态(推荐)  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  如何在阿里云完成域名注册与建站?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何在橙子建站中快速调整背景颜色?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  再谈Python中的字符串与字符编码(推荐)  如何用PHP工具快速搭建高效网站?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  linux写shell需要注意的问题(必看)  微信小程序 scroll-view组件实现列表页实例代码  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言