C# 单例模式的多种实现

单例模式介绍

单例模式是一种创建型设计模式,它主要确保在一个类只有一个实例,并提供一个全局访问点来获取该实例。在C#中,有多种方式实现单例模式,每种方式都有其特定的使用场景和注意事项。

设计模式的作用

  • 提高代码的可重用性:通过定义一套标准的解决方案,设计模式使得相同或类似的问题可以在不同的项目中复用相同的代码结构或逻辑。
  • 增强代码的可读性:设计模式使用清晰、简洁的方式表达复杂的代码逻辑,使得其他开发者能够更容易地理解和维护代码。
  • 提高系统的可维护性:设计模式遵循一定的设计原则,如开闭原则、里氏代换原则等,这些原则有助于降低系统各部分的耦合度,提高系统的可扩展性和可维护性。

饿汉式单例模式

饿汉式单例是在类加载时就创建实例。优点是实现简单,缺点是如果该实例不被使用会造成资源浪费。

复制代码
`        /// <summary>`
`        /// 饿汉式单例模式`
`        /// </summary>`
`        public class SingletonEager`
`        {`
`            private SingletonEager() { }`

`            private static readonly SingletonEager _instance = new SingletonEager();`

`            public static SingletonEager Instance`
`            {`
`                get { return _instance; }`
`            }`

`            public void DoSomething()`
`            {`
`                Console.WriteLine("饿汉式单例模式.");`
`            }`
`        }`

懒汉式单例模式

懒汉式单例在第一次被访问时才创建实例。为了线程安全,通常需要使用锁机制。

复制代码
`        /// <summary>`
`        /// 懒汉式单例模式`
`        /// </summary>`
`        public class SingletonLazy`
`        {`
`            private SingletonLazy() { }`

`            private static SingletonLazy? _instance;`

`            private static readonly object _lockObj = new object();`

`            public static SingletonLazy Instance`
`            {`
`                get`
`                {`
`                    if (_instance == null)`
`                    {`
`                        lock (_lockObj)`
`                        {`
`                            if (_instance == null)`
`                            {`
`                                _instance = new SingletonLazy();`
`                            }`
`                        }`
`                    }`
`                    return _instance;`
`                }`
`            }`

`            public void DoSomething()`
`            {`
`                Console.WriteLine("懒汉式单例模式.");`
`            }`
`        }`

懒加载单例模式

如果您使用的是 .NET 4(或更高版本),可以使用Lazy类来实现线程安全的懒加载单例模式。

复制代码
`        /// <summary>`
`        /// 懒加载单例模式`
`        /// </summary>`
`        public sealed class SingletonByLazy`
`        {`
`            private static readonly Lazy<SingletonByLazy> _lazy = new Lazy<SingletonByLazy>(() => new SingletonByLazy());`

`            public static SingletonByLazy Instance { get { return _lazy.Value; } }`

`            private SingletonByLazy() { }`

`            public void DoSomething()`
`            {`
`                Console.WriteLine("懒加载单例模式.");`
`            }`
`        }`

设计模式入门实战教程

https://mp.weixin.qq.com/s/FM0ThUR92EcXJ3YY313ifw

相关推荐
追逐时光者7 小时前
C#字符串拼接的几种方式及其性能分析对比
【.net】·【c#】·【.net core】·【拾遗补漏】
追逐时光者2 天前
一个.NET开源、易于使用的屏幕录制工具
【.net】·【开源项目】
追逐时光者3 天前
好消息,在 Visual Studio 中可以免费使用 GitHub Copilot 了!
【visual studio】·【.net】·【c#】·【实用工具】·【ai编程】
追逐时光者5 天前
基于.NET WinForm开发的一款硬件及协议通讯工具
【.net】·【开源项目】·【winform】
追逐时光者5 天前
一款基于 .NET MVC 框架开发、功能全面的MES系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者7 天前
C#/.NET/.NET Core技术前沿周刊 | 第 17 期(2024年12.09-12.15)
【.net】·【c#】·【.net core】·【技术前沿周刊】
追逐时光者7 天前
C#正则表达式快速入门
【.net】·【c#】·【.net core】·【拾遗补漏】
追逐时光者11 天前
一套以用户体验出发的.NET8 Web开源框架
【.net】·【c#】·【开源项目】·【.net core】