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#泛型概念的简介与泛型的使用

    C#泛型概念的简介与泛型的使用 什么是泛型? 泛型是C#中一种抽象的数据类型,它可以用于创建具有不同类型参数的可重用代码。在传统的数据类型中,只能通过指定数据类型来定义数据和方法。而泛型则可以在代码中定义一个泛型类型或方法,然后在创建实例时将其参数化,从而实现代码的通用性。 泛型类型定义非常灵活,可以定义任何类型的参数,例如引用类型、值类型或结构体等,还可以…

    C# 2023年6月7日
    00
  • 解析C#多线程编程中异步多线程的实现及线程池的使用

    解析C#多线程编程中异步多线程的实现及线程池的使用 什么是多线程? 多线程是指程序中同时执行多个线程,可以让应用程序同时执行多项任务,提高程序运行效率和用户体验。在C#中,可以使用Thread类或Task类来创建多线程应用。 什么是异步多线程? 异步多线程是指可以让应用程序在执行某个操作时不被阻塞,同时可以继续执行其他操作。在C#中,可以使用async和aw…

    C# 2023年5月15日
    00
  • C#中Dictionary泛型集合7种常见的用法

    下面是”C#中Dictionary泛型集合7种常见的用法”的完整攻略: 1. 创建Dictionary对象 使用Dictionary之前,首先需要创建Dictionary对象。可以通过以下代码创建: Dictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>(); 其中,T…

    C# 2023年5月31日
    00
  • 一起详细聊聊C#中的Visitor模式

    当我们在开发C#程序时,或多或少遇到过对象结构和操作之间互相依赖的情况,比如需要对某一组对象进行相同的操作。而当我们需要添加一个新的操作时,又不希望去修改原本的对象结构,因为这样做很容易引入新的错误,势必会导致系统不稳定。这个时候,我们可以考虑使用访问者模式(Visitor Pattern)来解决这个问题。 什么是Visitor模式 在C#中,访问者模式是一…

    C# 2023年6月7日
    00
  • C#几种截取字符串的方法小结

    下面是关于“C#几种截取字符串的方法小结”的完整攻略,包含两个示例。 1. C#几种截取字符串的方法 在C#中,有多种方法可以截取字符串。以下是常用的几种方法: 1.1. 使用Substring方法 可以使用Substring方法截取字符串的一部分。以下是一个示例: string str = "Hello, World!"; string…

    C# 2023年5月15日
    00
  • C#将DataTable转换成list的方法

    将DataTable转换成List是C#开发中常见的需求,下面是将DataTable转换成List的完整攻略。 步骤1:创建实体类 创建一个实体类作为转换后的对象类型。实体类中的属性需要与DataTable中的列对应。 public class Person { public int Id { get; set; } public string Name {…

    C# 2023年6月1日
    00
  • .net实体类与json相互转换

    下面我就详细讲解“.net实体类与json相互转换”的完整攻略。 1. 使用Newtonsoft.Json库进行转换 首先,我们需要使用Newtonsoft.Json库进行实体类和json字符串之间的相互转换。这个库是一个非常流行的json处理库,可以通过nuget包管理器来安装。 1.1 将实体类转换为json字符串 使用Newtonsoft.Json库将…

    C# 2023年5月31日
    00
  • C#中使用JSON.NET实现JSON、XML相互转换

    下面是使用JSON.NET实现JSON、XML相互转换的攻略: 1. 引入JSON.NET包 在C#中实现JSON、XML相互转换,需要引入JSON.NET包。可以通过NuGet包管理器来安装JSON.NET。打开NuGet包管理器,搜索JSON.NET,然后安装即可。 2. 将JSON字符串转为XML格式 在使用JSON.NET将JSON字符串转为XML格…

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