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

相关推荐
追逐时光者1 天前
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
【.net】·【c#】·【开源项目】·【.net core】·【拾遗补漏】
追逐时光者2 天前
2款使用.NET开发的数据库系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者3 天前
.NET开发者福音:JetBrains官方宣布 Rider 非商用免费开放!
【.net】·【c#】·【实用工具】·【.net core】
追逐时光者5 天前
C#/.NET/.NET Core技术前沿周刊 | 第 11 期(2024年10.21-10.31)
【.net】·【c#】·【.net core】·【技术前沿周刊】
追逐时光者6 天前
C#/.NET/.NET Core优秀项目和框架2024年10月简报
【.net】·【c#】·【开源项目】·【实用工具】·【.net core】·【每月简报】
追逐时光者7 天前
一份阅读量30万+免费且全面的C#/.NET面试宝典
【.net】·【c#】·【.net core】·【wpf】·【winform】·【面试指南】
追逐时光者9 天前
基于Material Design风格开源、免费的WinForms UI控件库
【.net】·【c#】·【winform】
追逐时光者10 天前
.NET使用Moq开源模拟库简化单元测试
【.net】·【c#】·【开源项目】·【.net core】