设计模式学习笔记——单例模式(Singleton)
1.特点:只需一个实例时考虑。
2.概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
3.类图:
4.程序实现:
1)懒汉式:对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。
懒汉模式只在外部对象第一次请求实例的时候才去创建。懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Singleton { private static Singleton m_Instance; private Singleton() { // 将默认构造函数定义为私有,防止外部调用它实例化别的对象 } public static Singleton GetInstance() { if (m_Instance == null ) { m_Instance = new Singleton(); } return m_Instance; } } |
2)饿汉式:对于饿汉模式,我们可以这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 定义为sealed防止派生,因为派生可能增加实例 public sealed class Singleton { private static readonly Singleton m_Instance = new Singleton(); private Singleton() { // 将默认构造函数定义为私有,防止外部调用它实例化别的对象 } public static Singleton GetInstance() { return m_Instance; } } |
3)使用锁机制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class Singleton { private static Singleton m_Instance; static readonly object o = new object (); private Singleton() { // 将默认构造函数定义为私有,防止外部调用它实例化别的对象 } public static Singleton GetInstance() { lock (o) { if (m_Instance == null ) { m_Instance = new Singleton(); } } return m_Instance; } } |
4)双重锁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class Singleton { private static Singleton m_Instance; static readonly object o = new object (); private Singleton() { // 将默认构造函数定义为私有,防止外部调用它实例化别的对象 } public static Singleton GetInstance() { // 这里增加了一个判断实例是否存在,只有在不存在时才给加锁,也就是在这个实例的生命周期中只加过一次锁 if (m_Instance == null ) { lock (o) { if (m_Instance == null ) { m_Instance = new Singleton(); } } } return m_Instance; } } |
分类:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构