网站首页 > 基础教程 正文
什么是单例模式
单例模式(Singleton Pattern)是 C#中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式实现的条件
· 1、单例类只能有一个实例。
· 2、单例类必须自己创建自己的唯一实例。
· 3、单例类必须给所有其他对象提供这一实例。
单例模式介绍
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
优点:
· 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
· 2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景:
· 1、要求生产唯一序列号。
· 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
· 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
单例模式的实现
双检锁/双重校验锁 简称双if+lock
使用双if+lock这种方式实现最大的优点就是线程安全,缺点是加锁影响效率。
源码
//双if+lock
class Sigleton
{
private Sigleton()
{
}
private static Sigleton _Sigleton=null;
private static Object sigleton_lock = new object();
public static Sigleton CreateInstance()
{
if(_Sigleton==null)
{
lock (sigleton_lock)
{
if (_Sigleton == null)
{
_Sigleton = new Sigleton();
}
}
}
return _Sigleton;
}
}
饿汉式单例-----利用静态构造函数
首先介绍静态构造函数
1静态函数没有修饰符修饰(默认修饰符为private,但是你不能写出来)
2.静态构造函数是系统默认调用的,程序员无法手动调用
3.如果类中没有静态构造函数,而此时类中包含静态字段(未初始化的)那么此时编译器会默认生成静态构造函数
4.在静态类中或方法中,不能使用对象
5.如果类中包含静态成员,且没有被初始化,系统会默认提供一个默认的值,这也间接说明了我们不可以直接调用静态构造函数,这也没办法控制静态函数的执行时间
6.静态构造函数只能被调用一次,并且不能有重复
7.静态构造函数不能有参数
8.虽然静态构造函数和普通构造函数名字一样,但是系统规定他俩可以共存,尽管参数列表一样
9.静态构造函数是在普通构造函数调用之前执行,一般情况下用于初始化静态字段或者拦截在实例化之前
静态构造函数:由CLR保证,在第一次使用这个类之前,调用而且只调用一次
源码
//单利模式第二种写法
class SigletonSecond
{
private SigletonSecond()
{
}
private static SigletonSecond _Sigleton = null;
//静态构造函数:由CLR保证,在第一次使用这个类之前,调用而且只调用一次
static SigletonSecond()
{
_Sigleton = new SigletonSecond();
}
public static SigletonSecond CreateInstance()
{
return _Sigleton;
}
}
饿汉式
静态变量:会在类型第一次使用的时候初始化,而且只初始化一次
源码
//单利模式第三种写法
class SigletonThird
{
private SigletonThird()
{
}
//静态变量:会在类型第一次使用的时候初始化,而且只初始化一次
private static SigletonThird _Sigleton = new SigletonThird();
public static SigletonThird CreateInstance()
{
return _Sigleton;
}
}
总结
在内存中只有一个对象,节省内存空间;
避免频繁的创建销毁对象,可以提高性能;
避免对共享资源的多重占用,简化访问;
为整个系统提供一个全局访问点。
- 上一篇: C#设计模式-单例模式 c#单例模式详解
- 下一篇: 什么叫单例?使用举例 什么是单例模式举例说明
猜你喜欢
- 2024-12-28 CSnakes:在.NET项目中嵌入Python代码的工具
- 2024-12-28 巧用泛型设计模式,提升代码质量新高度
- 2024-12-28 巅峰对决!Spring Boot VS .NET 6 巅峰对决之干碎龙王短剧全集完整版第5集
- 2024-12-28 基于C#开发的物联网设备通讯协议客户端终身开源免费
- 2024-12-28 C# Flurl 库浅析(一) c#folderbrowserdialog
- 2024-12-28 C# Lazy的缺点 c#的介绍
- 2024-12-28 微服务——webapi实现,脱离iis,脱离tomcat
- 2024-12-28 231.C# 跨平台服务开发 c++跨平台开发
- 2024-12-28 C# 和 .NET 开发的 10 种基本模式
- 2024-12-28 基于C# 开发的物联网设备通讯协议客户端
- 01-08将 Excel 表格中每三行合并到一个单元格中,用“、”隔开
- 01-08使用办公软件按表格中从上往下合并成1个TXT文档并添加分隔符号
- 01-08新歌尝鲜 3《分割线》
- 01-08怎么分割视频?这几种分割方法非常简单
- 01-08视频怎么分割?教你简单的三种方法
- 01-08分隔:整理大脑的 5 种方法
- 01-08「深度」凯文-杜兰特的九年雷霆光阴
- 01-08深度丨涅磐重生到“超级3D”球星?他还是无所不能的保罗·乔治
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)