C#实现单件模式的三种常用方法

C#实现单件模式的三种常用方法

在设计模式中,单件模式(Singleton Pattern)是一种常用的创建型设计模式,它能够确保一个类只有一个实例,并提供全局的访问点。在C#中,实现单件模式的方法比较多,本文将介绍其中的三种常用方法。

方法一:饿汉式(静态初始化)

饿汉式是最简单、常用的实现单件模式的方式之一。它在类加载时就创建了实例,因此线程安全,但是会增加启动时间和内存开销。

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

    private Singleton() { }

    public static Singleton Instance => instance;
}

方法二:懒汉式(双重锁定)

懒汉式是在需要时才创建实例,可以减少启动时间和内存开销。但是由于涉及到多线程处理,因此需要进行双重锁定以确保线程安全。

public sealed class Singleton
{
    private static volatile Singleton instance;
    private static readonly object syncRoot = new object();

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}

方法三:静态内部类

静态内部类是在C#中比较少用到的实现单件模式的方式。它利用了类在初始化时同步的特性,可以保证线程安全。但是需要注意,该方式只能在.NET Framework 4.0及以上版本中使用。

public sealed class Singleton
{
    private Singleton() { }

    public static Singleton Instance => Nested.instance;

    private class Nested
    {
        static Nested() { }
        internal static readonly Singleton instance = new Singleton();
    }
}

示例说明:

假设有一个日志记录器,我们需要确保它只有一个实例,可以采用单件模式进行实现。

public sealed class Logger
{
    private static volatile Logger instance;
    private static readonly object syncRoot = new object();

    private Logger() { }

    public static Logger Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new Logger();
                    }
                }
            }
            return instance;
        }
    }

    public void Log(string message)
    {
        // 记录日志
    }
}

调用示例:

var logger1 = Logger.Instance;
var logger2 = Logger.Instance;
Console.WriteLine(logger1 == logger2); // 输出:True
logger1.Log("Hello World!");

在以上示例中,我们通过Logger.Instance来获取唯一的Logger实例,然后记录日志信息,通过对比获取到的两个实例是否相等,验证了单件模式的正确性。

另外,在实现懒汉式时,采用的是双重锁定机制,即在获取实例前进行了一次检查,如果实例为空,则对类型进行锁定,再次检查实例是否为空,最后再创建实例。如果在lock语句之外进行检查,就有可能出现多个线程竞争创建实例的情况。

到这里为止,我们已经完整、详细地讲解了C#实现单件模式的三种常用方法,如果有不理解的地方可以提出来。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现单件模式的三种常用方法 - Python技术站

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

相关文章

  • C#使用NPOI导入Excel的方法详解

    下面详细讲解“C#使用NPOI导入Excel的方法详解”的完整攻略。 安装NPOI 要使用NPOI,需要先安装它。可以通过NuGet包管理器搜索和安装NPOI。 导入Excel的方法 首先,需要先读取Excel文件。可以使用NPOI中的HSSFWorkbook或XSSFWorkbook类来打开Excel文件。 using NPOI.HSSF.UserMode…

    C# 2023年6月7日
    00
  • C# 实现与现有.NET事件桥接简单实例

    接下来我将为你详细讲解 “C# 实现与现有.NET事件桥接简单实例”的完整攻略。主要包括以下两个步骤: 步骤一:桥接现有.NET事件 C# 中实现与现有.NET事件桥接的方式,是通过使用 delegate 委托类型和 event 事件类型来实现的。 1.1 创建一个委托类型 public delegate void MyEventHandler(object…

    C# 2023年5月31日
    00
  • C#算法之实现阿姆斯特朗数

    C#算法之实现阿姆斯特朗数 什么是阿姆斯特朗数? 阿姆斯特朗数是指一个n位数(n>1),它的所有位数上的数字的n次方之和等于它本身。例如:$153$是一个3位数,$153=1^3+5^3+3^3$ 实现方法 实现阿姆斯特朗数的方法比较简单,直接通过循环、取余、除法以及求幂等方式来计算即可。 首先定义一个变量$number$表示要计算的数。 计算此数的位…

    C# 2023年6月6日
    00
  • ASP.NET Core项目配置教程(6)

    ASP.NET Core项目配置教程(6)主要涉及如何在ASP.NET Core项目中使用配置文件。下面是ASP.NET Core项目配置教程(6)的完整攻略。 什么是配置文件? 在ASP.NET Core中,配置文件是一种存储应用程序配置信息的机制。配置文件可以包含应用程序的各种设置,例如数据库连接字符串、日志记录级别、身份验证设置等。 如何使用配置文件?…

    C# 2023年5月16日
    00
  • C#中Invoke 和 BeginInvoke 的真正涵义

    下面是详细的讲解“C#中Invoke和BeginInvoke的真正涵义”的攻略。 Invoke和BeginInvoke的概述 在C#中,Invoke和BeginInvoke是两个常用的方法,用于在UI线程上执行操作。它们的主要目的是“跨线程访问UI控件”,因为在Windows Forms、WPF、ASP.NET Web Forms等应用程序中,只能在创建UI…

    C# 2023年6月7日
    00
  • .NET 6中的dotnet monitor讲解

    .NET 6中的dotnet monitor讲解攻略 在本攻略中,我们将深入讲解.NET 6中的dotnet monitor,并提供两个示例说明。 什么是dotnet monitor? dotnet monitor是一个用于监视.NET应用程序的命令行工具。它可以帮助开发人员快速识别和解决应用程序中的问题,例如内存泄漏、CPU使用率过高等。 如何安装dotn…

    C# 2023年5月17日
    00
  • C#软件注册码的实现代码

    下面为您提供 “C#软件注册码的实现代码” 的详细攻略。 1. 概述 “软件注册码” 是一串由软件作者生成的唯一代码,用于验证软件的合法性。通常,用户需要在安装软件后输入注册码,以便解锁软件的全部功能。 在C#语言中,我们可以生成随机的注册码,并将其与用户输入的注册码进行比对来验证其合法性。 2. 实现方法 我们可以使用”MD5加密算法”和”Base64编码…

    C# 2023年5月31日
    00
  • C#对象为Null模式(Null Object Pattern)实例教程

    C#对象为Null模式(Null Object Pattern)实例教程 介绍 在C#中,经常需要处理对象是否为null的情况。在编写代码时,我们通常会使用”if(null)”这样的条件语句进行处理。然而,这种处理方式复杂度较高,容易出错。通过Null Object Pattern模式,我们可以将对象的null值进行抽象化,简化代码编写。 实现 方案一:使用…

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