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#实现向函数传递不定参数的方法

    在C#中,可以通过定义可变长度参数列表的语法来实现向函数传递不定参数的方法。这个语法是通过在函数参数列表的最后一个参数前添加“params”关键字来实现的。 具体实现步骤如下: 定义函数时,在函数的参数列表中定义一个参数类型为可变长度参数数组的参数,关键字为“params”,并定义一个参数名。 例如: public static void PrintList…

    C# 2023年6月1日
    00
  • Unity3D使用Shader实现腐蚀消失

    下面是关于Unity3D使用Shader实现腐蚀消失的完整攻略: 简介 腐蚀消失是一个常见的特效,可以让物体表面逐渐腐蚀和消失,通常用在游戏特效、电影电视等场合。在Unity中,我们可以使用Shader来实现腐蚀消失特效,本文将详细讲解如何使用Shader实现腐蚀消失。 实现步骤 第一步:创建材质球 首先,我们需要创建一个材质球,并将材质球的Shader属性…

    C# 2023年6月3日
    00
  • win10下ASP.NET Core部署环境搭建步骤

    win10下ASP.NET Core部署环境搭建步骤 ASP.NET Core是一个跨平台的开源Web框架,可以在Windows、Linux和macOS等操作系统上运行。在本攻略中,我们将介绍如何在Windows 10操作系统上搭建ASP.NET Core部署环境,并提供两个示例说明。 1. 安装.NET Core SDK 在Windows 10操作系统上搭…

    C# 2023年5月16日
    00
  • C#编程实现带有Aero效果的窗体示例

    C#编程实现带有Aero效果的窗体示例 介绍 Aero是Windows Vista中引进的一个用户界面特性,主要是增强用户界面的可观性和交互性,如透明度、窗口预览、任务栏缩略图等。在C#编程中,我们可以通过代码实现带有Aero效果的窗体,提高程序的用户体验。 本文将详细说明如何通过C#编程实现带有Aero效果的窗体,包含两条示例说明。 实现步骤 步骤1:安装…

    C# 2023年5月31日
    00
  • 用序列化实现List 实例的深复制(推荐)

    使用序列化实现List实例的深复制可以保证复制后的实例与原实例完全独立而不会相互影响。下面是使用序列化实现List实例深复制的详细攻略: 什么是深复制 深复制是指复制对象时,每个对象都会被单独复制一份,这两份对象完全独立而相互没有影响。这与浅复制不同,浅复制只是把对象的引用复制一份,这样两个对象会共用同一个引用,从而相互影响。 使用序列化实现深复制 针对Li…

    C# 2023年5月31日
    00
  • 基于C# winform实现图片上传功能的方法

    下面是“基于C# Winform实现图片上传功能的方法”的完整攻略: 一、准备工作 首先,我们需要将Winform应用程序的工具箱中添加一个OpenFileDialog控件,用于选择要上传的图片;还需要添加一个PictureBox控件,用于展示已经选择好的图片。 二、上传图片的流程 获得待上传的图片的本地路径 使用OpenFileDialog控件的ShowD…

    C# 2023年6月2日
    00
  • Equals和==的区别 公共变量和属性的区别小结

    一、Equals和==的区别 1. 相同点 Equals和==都是用于比较两个对象是否相等的方法; 对于基本类型,两者均可使用。 2. 不同点 Equals比较的是两个对象的内容是否相等; ==比较的是两个对象的引用是否相等。 示例1: string str1 = "hello"; string str2 = "hello&qu…

    C# 2023年6月3日
    00
  • C#中FormsAuthentication用法实例

    下面是关于“C#中FormsAuthentication用法实例”的完整攻略。 一、什么是FormsAuthentication FormsAuthentication 是 ASP.NET 提供的一种 Forms 身份验证机制,它使用基于 Cookie 的认证方式来验证用户身份。 在使用 FormsAuthentication 时我们需要进行以下几步: 创建…

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