.NET单例模式快速学习应用
2019-11-19 11:45
155 查看
单例模式属于设计模式中最简单的一个模式,在实际应用中也非常广泛,但可能是受到各类教程的影响,看到很多实现方式仍然沿用Java的那一套,其实在.NET中可以用更简洁的实现方式。
一、知识点介绍
核心目标:为了项目各处调用的都是同一个实例对象,从而实现资源共享。例如环境变量。
常见的实现方式:饿汉模式、懒汉模式、双锁模式、延迟加载模式
二、实现方式
感谢评论中@Esofar提到的延迟加载模式,确实是一个优秀的实现,在下面补上我优化过后的实现方式。
/// <summary> /// 饿汉模式,每次都加载会造成资源浪费 /// </summary> public class EagerSingleton { public static Demo Instance { get; } = new Demo(); }
/// <summary> /// 懒汉模式,适用于没有多线程的简单应用 /// </summary> public class LazySingleton { private static Demo _instance = null; public static Demo Instance { get { if (_instance == null) _instance = new Demo(); return _instance; } } }
/// <summary> /// 线程安全 /// </summary> public class ThreadSafeSingleton { private static Demo _instance = null; private static readonly object _lock = new object(); public static Demo Instance { get { if (_instance == null) { lock (_lock) { if (_instance == null) _instance = new Demo(); } } return _instance; } } }
/// <summary> /// 延迟加载,利用静态类访问即创建的特点,兼顾易用性和线程安全的最佳实践 /// </summary> public class DelaySingleton { /// <summary> /// 内部静态类 /// </summary> static class Nested { internal static readonly Demo Instance = new Demo(); } public static Demo Instance => Nested.Instance; }
调用方式
static void Main(string[] args) { ThreadPool.SetMaxThreads(25, 25);// 调整最大线程数 ThreadPool.SetMinThreads(10, 10);// 调整最小线程数 Console.WriteLine("========== 示例:饿汉模式的多线程 =========="); Parallel.For(0, 10, (i) => { Console.WriteLine($"{EagerSingleton.Instance.Id} "); }); Console.WriteLine(); Console.WriteLine("========== 示例:懒汉模式的多线程 =========="); Parallel.For(0, 10, (i) => { Console.WriteLine($"{LazySingleton.Instance.Id} "); }); Console.WriteLine(); Console.WriteLine("========== 示例:线程安全模式的多线程 =========="); Parallel.For(0, 10, (i) => { Console.WriteLine($"{ThreadSafeSingleton.Instance.Id} "); }); Console.WriteLine(); Console.WriteLine("========== 示例:延迟加载模式的多线程 =========="); Parallel.For(0, 10, (i) => { Console.WriteLine($"{DelaySingleton.Instance.Id} "); }); Console.ReadKey(); } public class Demo { public string Id { get; private set; } public Demo() { Id = Guid.NewGuid().ToString(); } }
调用结果:
三、结论
> 饿汉模式适用于规模不大又涉及多线程的应用,但是要关注单例的对象的资源占用情况。
> 懒汉模式适用于不需要多线程的应用,容易理解记住并且效果还不错。
> 双锁模式兼顾了实用性和线程安全,在之前的系统开发中比较常见。
> 延迟加载模式,目前我看到的最佳实践,兼顾了易用性和线程安全,能理解的话可以采用这种方式。
> 单例模式不要实现 ICloneable 接口,不要涉及序列化,否则就会出现多个对象。
四、参考资料
相关文章推荐
- .Net语言 APP开发平台——Smobiler学习日志:快速实现应用中的图片、声音等文件上传功能
- .NET 应用架构指导 V2 学习笔记(二) 软件架构的模式和风格
- .Net语言 APP开发平台——Smobiler学习日志:手机应用的TextTabBar快速实现方式
- .NET 应用架构指导 V2 学习笔记(三) 软件架构的模式和风格
- .Net语言 APP开发平台——Smobiler学习日志:在手机应用开发中如何快速实现应用间的分享功能
- .Net语言 APP开发平台——Smobiler学习日志:在手机应用开发中如何快速调用电话拨打功能
- 快速入门过程与方法:设计与思路;如何学习新的知识框架,建立思维模式,熟悉应用场景体系
- 步步为营 .NET 设计模式学习笔记 四、Singleton(单例模式)
- 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)
- YII Framework学习教程-用YIIC快速创建YII应用之二-2011-11-11
- 步步为营 .NET 设计模式学习笔记 二十一、Visitor(访问者模式)
- Android源码学习之模板方法模式应用
- SPRING.NET 1.3.2 学习2--快速入门应用示例说明
- 步步为营 .NET 设计模式学习笔记 二、Abstract Factory(抽象工厂)
- Android源码学习之装饰模式应用
- 黑马程序员---OC学习笔记之autorelease快速创建对象的应用
- .NET Romoting 学习总结(一)——Remoting技术之激活模式全接触
- JAVA学习--接口的应用:工厂方法的设计模式
- 使用.NET开发可扩展性应用的学习
- YII Framework学习教程-用YIIC快速创建YII应用之三