c#设计模式之单例模式的实现方式

C#设计模式之单例模式的实现方式

什么是单例模式

单例模式是设计模式的一种,它保证在整个应用程序生命周期中只能有一个实例被创建和访问,并且这个实例是全局唯一的。在需要频繁创建和销毁对象时,单例模式可以提高程序的性能和可维护性。

单例模式的实现方式

在 C# 中,单例模式有多种实现方式,如下:

第一种:懒汉式单例模式

使用懒汉式单例模式,在第一次调用 GetInstance() 方法时创建单例对象。如果多个线程同时调用 GetInstance() 方法,可能会出现多个实例的情况,因此需要进行线程同步。

public class LazySingleton
{
    private static Lazy<LazySingleton> instance = new Lazy<LazySingleton>(() => new LazySingleton());

    private LazySingleton() { }

    public static LazySingleton GetInstance()
    {
        return instance.Value;
    }
}

第二种:饿汉式单例模式

使用饿汉式单例模式,就可以确保只有一个实例对象被创建和访问,在加载时就创建了单例对象。

public class EagerSingleton
{
    private static readonly EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() { }

    public static EagerSingleton GetInstance()
    {
        return instance;
    }
}

单例模式的示例说明

示例1:单线程环境下的单例模式

在单线程环境下的单例模式实现比较简单,只需使用饿汉式单例模式即可。

class Program
{
    static void Main(string[] args)
    {
        // 饿汉式单例模式
        var instance1 = EagerSingleton.GetInstance();
        var instance2 = EagerSingleton.GetInstance();

        if (instance1 == instance2)
            Console.WriteLine("EagerSingleton works");
        else
            Console.WriteLine("EagerSingleton fails");

        Console.ReadKey();
    }
}

输出结果:

EagerSingleton works

示例2:多线程环境下的单例模式

在多线程环境下的单例模式实现需要考虑线程安全的问题,可以使用双重检查锁进行优化。

class Program
{
    static void Main(string[] args)
    {
        // 懒汉式单例模式
        var tasks = new List<Task<LazySingleton>>();

        for (int i = 0; i < 10; i++)
        {
            tasks.Add(Task.Run(() =>
            {
                return LazySingleton.GetInstance();
            }));
        }

        Task.WaitAll(tasks.ToArray());

        var instances = tasks.Select(t => t.Result);

        if (instances.Distinct().Count() == 1)
            Console.WriteLine("LazySingleton works");
        else
            Console.WriteLine("LazySingleton fails");

        Console.ReadKey();
    }
}

输出结果:

LazySingleton works

在示例2中,我们创建了 10 个异步任务同时获取 LazySingleton 的实例,如果单例模式实现正确,那么所有的实例应该是相等的。如果代码实现有问题,则会出现多个实例的情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#设计模式之单例模式的实现方式 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • 用C#中的params关键字实现方法形参个数可变

    使用params关键字可以实现C#中方法形参个数可变。在方法的参数列表中,可以在最后一个参数前添加params关键字,这个参数就会成为可变参数,允许传递多个同类型的值,并把它们打包成一个数组。下面是具体的步骤: 1.在方法定义时,在最后一个参数前添加params关键字,表示该参数可以传递多个同类型的值。 2.在方法内部,使用该参数时,直接把该参数当成数组来使…

    C# 2023年6月8日
    00
  • 快速插入大量数据的asp.net代码(Sqlserver)

    下面是一份关于如何快速插入大量数据的asp.net代码(Sqlserver)的攻略: 1. 批量插入数据的原理 快速插入大量数据的原理是通过一次插入多行数据来减少多个单行插入的开销。具体而言,就是使用SQL Server提供的Bulk Copy功能实现批量插入数据。 2. 使用Bulk Copy实现批量插入数据 首先,我们需要先创建一个DataTable对象…

    C# 2023年5月31日
    00
  • C# FileAttributes.Hidden:表示文件或目录为隐藏文件或目录

    FileAttributes.Hidden 方法是C#中用于操作文件或目录隐藏属性的方法。该方法可用于获取或设置文件或目录是否作为隐藏文件或目录。 方法作用 FileAttributes.Hidden 方法作用如下: 获取指定路径下的文件或目录是否作为隐藏文件或目录。 设置指定路径下的文件或目录是否作为隐藏文件或目录。 使用方法 获取文件/目录隐藏属性 使用…

    C# 2023年4月19日
    00
  • asp.net 操作excel的实现代码

    下面我来详细讲解一下“ASP.NET操作Excel的实现代码”的完整攻略,包含以下几个部分: 了解ASP.NET操作Excel的前提条件 使用C#代码操作Excel文件 使用EPPlus操作Excel文件 实例说明:导入Excel数据到ASP.NET网站 实例说明:导出ASP.NET网站数据到Excel文件 了解ASP.NET操作Excel的前提条件 在使用…

    C# 2023年5月31日
    00
  • 基于jquery的分页控件(C#)

    基于jQuery的分页控件(C#)攻略 概述 本文将介绍如何使用jQuery编写基于C#的分页控件。分页控件可以提高页面的易读性和易用性,方便用户查看数据。 分页控件的实现方式 实现一个分页控件主要分为两个部分: 服务端代码,用于提供数据或者查询数据(本文中使用C#做演示)。 客户端代码,用于实现分页控件的交互和显示(本文中使用jQuery做演示)。 服务端…

    C# 2023年5月31日
    00
  • ASP.NET MVC在基控制器中处理Session

    处理Session是ASP.NET开发中的一个常见需求。我们可以在ASP.NET MVC的基控制器中统一处理Session,这样可以更方便地管理Session数据,也提高了代码的复用性。 以下是基控制器中处理Session的完整攻略: 创建一个基控制器 首先,在项目中创建一个基控制器,该基控制器将包含所有控制器所需的公共方法和属性。在该基控制器中处理Sess…

    C# 2023年5月31日
    00
  • C#实现XSL转换的方法

    C# 实现 XSLT 转换的方法 XSLT(Extensible Stylesheet Language Transformations)是一种将 XML 数据转换成其他格式的语言,包括 HTML、XHTML、XML、PDF、Word 等。在 C# 中,我们可以使用 System.Xml.Xsl.XslCompiledTransform 类来进行 XSLT …

    C# 2023年6月7日
    00
  • C#实现进制转换

    C#实现进制转换的完整攻略 在C#中,要实现进制转换可以使用Convert类提供的方法,主要有以下三个: ToInt32:将指定的字符串转换为32位带符号整数。 ToString:将指定的数字转换为字符串。 Parse:将字符串表示形式转换为等效的数字表示形式。 十进制转二进制 定义一个十进制数 int number = 123; 将其转换为二进制数 str…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部