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日

相关文章

  • 简单了解.NET Framework

    下面是关于“简单了解.NET Framework”的完整攻略,包含两个示例。 1. .NET Framework简介 .NET Framework是一个由Microsoft开发的应用程序框架,它提供了一组用于开发和运行Windows应用程序的技术。.NET Framework包括一个运行时环境(Common Language Runtime)和一个类库(Fr…

    C# 2023年5月15日
    00
  • C# Dockpanel入门基础必看篇

    C# Dockpanel入门基础必看篇 什么是Dockpanel? Dockpanel是一种布局方式,使用Dockpanel可以轻松地将控件水平或垂直对齐,并且可以容易地拉伸控件来扩展面板空间。 如何使用Dockpanel? 步骤一:安装Dockpanel插件 首先,在Visual Studio的“工具”菜单中点击“NuGet包管理器”,在弹出的窗口中选择“…

    C# 2023年5月31日
    00
  • C#网页信息采集方法汇总

    标题:C#网页信息采集方法汇总 介绍 C#是一种面向对象的编程语言,在网络爬虫中有广泛的应用。本文将介绍C#网页信息采集的基础知识和常用的方法,让大家快速入门。 基础知识 HTML和CSS 网页是由HTML和CSS构成的,HTML用来定义网页的内容结构,CSS用来定义网页的样式和布局。在进行网页信息采集前,需要了解HTML和CSS的基础知识。 HTTP协议 …

    C# 2023年5月31日
    00
  • asp.net网站底部的版权信息实现代码且可维护

    关于ASP.NET网站底部的版权信息实现代码,一般有两种常见的实现方式,分别是通过ASP.NET Master页和ASP.NET User Control实现。 通过ASP.NET Master页实现 步骤一:创建Master页 在Visual Studio中创建Web应用程序,添加Master Page,并设置该Master Page为网站默认页。在Mas…

    C# 2023年5月31日
    00
  • C#开发交互式命令行应用示例

    C#开发交互式命令行应用示例的攻略主要包括以下步骤: C#版本和IDE的选择 首先需要选择合适的C#版本和开发工具,建议使用最新的C#版本和Visual Studio或者Visual Studio Code作为开发工具。 创建控制台项目 打开Visual Studio,创建一个控制台项目。在项目中添加命令行交互组件。 定义命令行参数 在命令行中,参数通常用来…

    C# 2023年6月7日
    00
  • C#实现启动,关闭与查找进程的方法

    下面是详细讲解“C#实现启动,关闭与查找进程的方法”的完整攻略。 启动进程 在C#中启动一个进程,可以使用Process类的Start方法。该方法可以接受一个指向可执行文件的路径作为输入参数,并返回一个Process对象,该对象表示对该进程的控制权。 例如: using System.Diagnostics; // 启动notepad进程 Process p…

    C# 2023年5月15日
    00
  • .net自定义事件示例分享

    下面是详细的“.net自定义事件示例分享”的攻略: 1. 简介 在 .NET 中,自定义事件是一种非常常见的编程模式,该模式便于构建松耦合、可扩展和可测试的代码。在 C# 中,使用以下语法创建自定义事件: public event EventHandler<MyEventArgs> MyCustomEvent; 其中,MyCustomEvent …

    C# 2023年5月31日
    00
  • Windows中利用计划任务实现自动备份文件

    在Windows中,可以使用计划任务(Task Scheduler)来定期自动备份文件。计划任务是Windows自带的一种工具,可以在指定的时间自动运行程序或脚本。本文将介绍如何使用计划任务实现自动备份文件的完整攻略。 步骤一:创建备份脚本 首先,需要创建一个备份脚本,用于备份指定的文件或目录。以下是一个备份脚本的示例: #!/bin/bash # 备份源目…

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