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

相关推荐
追逐时光者10 小时前
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者2 天前
一个.NET开源、快速、功能丰富的跨平台阅读服务器
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者3 天前
一个基于 .NET 8.0 构建的简单、跨平台、模块化商城系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者4 天前
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
【.net】·【c#】·【.net core】·【技术前沿周刊】
追逐时光者5 天前
使用Microsoft.Extensions.AI简化.NET中的AI集成
【.net】·【c#】·【开源项目】·【.net core】·【aigc】
追逐时光者6 天前
基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者7 天前
利用腾讯元器,将公众号变身为强大的.NET AI智能体
【.net】·【c#】·【ai编程】·【.net core】·【aigc】
追逐时光者9 天前
.NET现在可以做什么,有哪些公司在用的?
【.net】·【c#】·【.net core】
追逐时光者11 天前
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
【.net】·【c#】·【.net core】·【技术前沿周刊】
追逐时光者11 天前
基于.NET开源、功能强大且灵活的工作流引擎框架
【.net】·【c#】·【开源项目】·【.net core】