设计模式(七):单例模式
一、定义
单例就是一个实例。从始至终我们只需要维护这么一个实例,来节约资源。
二、实例
我们用构造函数创建实例,现在我们要维护此类只维护一个实例,那么我们需要将生产实例的能力也就是构造函数加以限制。
并通过一个统一的函数对外公开我们维护的唯一的实例。
2.1 第一代单例模式:利用懒加载,在确实要使用实例的时候才会创建单例
public class Single_1 { private static Single_1 single = null; private Single_1() { } public static Single_1 GetInstance() { if (single == null) { single = new Single_1(); Console.WriteLine("创建实例"); } return single; } }
保证创建一个实例,但是只是在单线程的环境下,如果多线程会怎么样?试试!!
客户端并发100线程:
//------------------------单例模式----------------------- System.Threading.Tasks.Parallel.For(0, 100, t => { Singleton.Single_1.GetInstance(); }); Console.ReadKey();
运行结果:运行结果由系统随即切片,可能结果不同。但是确实存在创建了多个实例。
2.2 针对多线程之间的同步问题:加锁
public class Single_2 { private static Single_2 single = null; private static object lockkey = new object(); private Single_2() { } public static Single_2 GetInstance() { lock (lockkey) { if (single == null) { single = new Single_2(); Console.WriteLine("创建实例"); } return single; } } }
效率高点的双检锁:
public static Single_2 GetInstance() { if (single == null) { lock (lockkey) { if (single == null) { single = new Single_2(); Console.WriteLine("创建实例"); } } } return single; }
2.3 静态构造函数构造单例:我们知道静态构造函数是线程安全的
public class Single_3 { private static Single_3 single = null; private Single_3() { } static Single_3() { single = new Single_3(); Console.WriteLine("静态实例"); } public static Single_3 GetInstance() { return single; } }
三、总结
合理使用单例模式可以提高性能节约内存。当然,现实项目中有很多的例子,至少项目中可以很常见单例子模式。
更多精彩原创心得,请关注微信公众号: 梯形

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?