C# 单例模式的多种实现方式

 更新时间:2024年11月07日 08:53:35   作者:追逐时光者  
单例模式是一种确保类只有一个实例的设计模式,主要用于提供全局访问点,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("懒加载单例模式.");
            }
        }

到此这篇关于C# 单例模式的多种实现的文章就介绍到这了,更多相关C# 单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#中System.IO.Pipelines库的使用详解

    C#中System.IO.Pipelines库的使用详解

    System.IO.Pipelines 是一个库,旨在使在 .NET 中执行高性能 I/O 更加容易,本文主要为大家详细介绍了System.IO.Pipelines具体使用方法,感兴趣的可以了解下
    2023-12-12
  • C#语法相比其它语言比较独特的地方(二)

    C#语法相比其它语言比较独特的地方(二)

    这篇文章主要介绍了C#语法相比其它语言比较独特的地方(二),本文讲解了internal与protected、private、enum、string的==、传引用等内容,需要的朋友可以参考下
    2015-04-04
  • C#结束Excel进程的步骤教学

    C#结束Excel进程的步骤教学

    在本篇文章里小编给大家分享了关于C#结束Excel进程的步骤教学内容,有兴趣的朋友们学习下。
    2019-01-01
  • OpenCvSharp实现Mat对象简单的像素操作

    OpenCvSharp实现Mat对象简单的像素操作

    这篇文章主要介绍了OpenCvSharp实现Mat对象简单的像素操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#实现斐波那契数列的几种方法整理

    C#实现斐波那契数列的几种方法整理

    这篇文章主要介绍了C#实现斐波那契数列的几种方法整理,主要介绍了递归,循环,公式和矩阵法等,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • C#使用自定义的泛型节点类实现二叉树类

    C#使用自定义的泛型节点类实现二叉树类

    这篇文章主要为大家详细介绍了C#如何使用自定义的泛型节点类 Node<T>实现二叉树类BinaryTree<T>及其方法,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • C#文件路径Path类介绍

    C#文件路径Path类介绍

    这篇文章介绍了C#中的文件路径Path类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#中整理了几种字符串截取方法小结

    C#中整理了几种字符串截取方法小结

    本文给大家整理了几种字符串截取方法, (Substring);(Remove);(Replace)方法和split方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • Winform 实现进度条弹窗和任务控制

    Winform 实现进度条弹窗和任务控制

    这篇文章主要介绍了Winform 实现进度条弹窗和任务控制的方法,帮助大家更好的利用c# winform进行开发,感兴趣的朋友可以了解下
    2020-12-12
  • C#逐行读取txt文件的方法

    C#逐行读取txt文件的方法

    这篇文章主要介绍了C#逐行读取txt文件的方法,是C#程序设计中非常实用的一个技巧,需要的朋友可以参考下
    2014-09-09

最新评论