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

相关推荐
追逐时光者12 小时前
C#使用yield关键字提升迭代性能与效率
【.net】·【c#】·【拾遗补漏】
追逐时光者2 天前
C#/.NET/.NET Core技术前沿周刊 | 第 22 期(2025年1.13-1.19)
【.net】·【c#】·【.net core】·【技术前沿周刊】
追逐时光者4 天前
一个基于 Roslyn 和 AvalonEdit 的跨平台 C# 编辑器
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者5 天前
C#数据结构与算法入门实战指南
【c#】·【开源项目】·【面试指南】
追逐时光者6 天前
一款基于 .NET8 + Vue 开源、免费、跨平台的企业级在线考试系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者8 天前
C#/.NET/.NET Core技术前沿周刊 | 第 21 期(2025年1.6-1.12)
【.net】·【c#】·【.net core】·【技术前沿周刊】
追逐时光者9 天前
推荐4款基于.NET开源、功能强大的CMS建站系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者10 天前
回顾 2024 年 12 个月的C#/.NET/.NET Core优秀项目和框架简报
【.net】·【c#】·【.net core】·【每月简报】
追逐时光者10 天前
.NET 中管理 Web API 文档的两种方式
【.net】·【c#】·【开源项目】·【.net core】·【拾遗补漏】
追逐时光者12 天前
一个适用于 .NET 的开源整洁架构项目模板
【.net】·【c#】·【开源项目】·【.net core】·【拾遗补漏】