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日

相关文章

  • Google.Protobuf工具在C#中的使用方法

    下面是“Google.Protobuf工具在C#中的使用方法”的完整攻略: 前置条件 在使用 Google.Protobuf 工具之前你需要安装 .NET Core SDK 和 Google.Protobuf 工具,安装方法如下: 安装 .NET Core SDK (1) 下载 .NET Core SDK(选择最新版本)安装包。 (2) 执行安装包,一路点击…

    C# 2023年6月1日
    00
  • 详解c# 数组(Array)

    详解C#数组(Array) 概述 C#数组是一组相同类型元素的有序集合,可以通过数组下标来访问每一个元素。在C#中,数组是一种按照顺序存储和访问一组元素的结构,数组的下标从0开始,最大下标为数组长度减1。数组是C#中最常用的数据结构之一,能够有效地存储和处理大量数据。 创建和初始化数组 创建数组的语法如下: type[] arrayName; 其中,type…

    C# 2023年5月31日
    00
  • C#算法之大牛生小牛的问题高效解决方法

    C#算法之大牛生小牛的问题高效解决方法 问题描述 题目来源于 LeetCode,现在有一只大牛和一只小牛,它们的初始体重分别为 $x$ 和 $y$,每年它们的体重都会增加固定的比例(比例为 $p$),求当小牛的体重超过大牛的体重时,需要多少年。 解题思路 考虑使用循环解决。 每年大牛的体重增加 $p$%,小牛的体重增加 $2p$%,那么循环条件可以设为小牛体…

    C# 2023年6月7日
    00
  • C#读写EXCEL单元格的问题实现

    下面是“C#读写EXCEL单元格的问题实现”的完整攻略。 1. 安装依赖 首先需要在项目中安装 EPPlus 包,它是一款用于读写Excel文件的开源包。可以在NuGet中搜索 EPPlus 进行安装。 2. 读取Excel文件 假设我们有一个Excel文件,路径为 D:\test.xlsx,我们需要读取其中的内容。 2.1. 加载Excel文件 FileI…

    C# 2023年5月15日
    00
  • C#强制类型转换小结

    C#强制类型转换小结 在C#中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。在某些情况下,编译器可以自动执行类型转换,这称为隐式类型转换。但是在其他情况下,需要手动控制类型转换,这称为强制类型转换。 强制类型转换的语法 强制类型转换可以通过使用括号和类型名称来实现。语法如下: (type) expression 其中,type 是要转换成的类型,…

    C# 2023年5月15日
    00
  • C#利用服务器实现客户端之间通信

    C#利用服务器实现客户端之间通信 在C#中,我们可以使用 TCP、UDP 等协议,以及 socket 编程来实现客户端之间的通信。下面将详细介绍基于 TCP 协议的服务器和客户端之间的通信实现。 环境准备 在进行操作之前,需要准备以下环境: 安装 Visual Studio 开发工具 使用 C# 语言进行开发 服务器端代码 1. 引入命名空间 要使用 soc…

    C# 2023年6月7日
    00
  • C#实现MySQL命令行备份和恢复

    下面是详细讲解“C#实现MySQL命令行备份和恢复”的完整攻略。 简介 在MySQL中,备份数据和恢复数据都是非常重要的操作,它们能够保证数据在遭遇意外情况时的安全,帮助我们从容应对可能出现的数据丢失、损坏等问题。这里,我们将通过C#来实现MySQL的备份和恢复操作。 备份MySQL数据 步骤一:安装MySQL命令行工具 在开始备份之前,我们需要先安装MyS…

    C# 2023年6月2日
    00
  • asp.net获取当前网址url的各种属性(文件名、参数、域名 等)的代码

    当ASP.NET页面和控件运行时,可以通过Request对象的属性来获取当前网址的各种属性。 以下是获取当前网址url的一些常用属性: 获取当前页面的URL Request.Url.AbsoluteUri 该属性返回当前页面的完整URL,包括协议、域名、端口号、路径和查询字符串。如:https://www.example.com/test.aspx?id=1…

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