.NET单例模式的另类实现方式Lazy

共 2882字,需浏览 6分钟

 ·

2024-03-29 14:00

简介

    在C#中,Lazy<T> 是一个泛型类,用于延迟加载对象的创建,直到第一次访问该对象时才会实例化。这种延迟加载的方式有助于提高性能和资源利用率,尤其是在处理大量数据或耗时的操作时。主要用途有“延迟加载”,“性能优化”,“单例模式”,本文将介绍Lazy<T>实现单例模式。

Lazy<T>实现单例简介

    单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点以便于其他代码获取该实例。这对于需要共享某些资源或状态的情况非常有用。而Lazy<T>延迟加载对象的特性,可以让对象第一次访问才会实例化,第二次及以后的访问将不再创建新的对象。Lazy<T> 会记住第一次创建的实例,从而实现另类单例模式。

Lazy<T>实现单例案例

以下是一个使用 Lazy<T> 实现单例模式的示例

      
        public class Singleton
      
      
        {
      
      
            // 使用 Lazy<T> 来确保线程安全的延迟加载
      
      
            private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton(), LazyThreadSafetyMode.ExecutionAndPublication);
      
      
        
          
// 私有构造函数,防止外部直接实例化 private Singleton() { // 初始化操作 Console.WriteLine("单例实例创建.");     } // 公共访问点,通过 lazyInstance.Value 获取单例实例 public static Singleton Instance => lazyInstance.Value;
public void Fun() { Console.WriteLine("调用方法测试:欢迎关注公众号“DOTNET开发跳槽”"); } } //调用 // 获取单例实例 Singleton instance1 = Singleton.Instance; Singleton instance2 = Singleton.Instance; // 验证是否为同一实例 Console.WriteLine($"否为同一实例? {instance1 == instance2}"); //方法调用 instance2.Fun();

在这个例子中,Singleton 类有一个私有的 Lazy<Singleton> 实例,使用 LazyThreadSafetyMode.ExecutionAndPublication 确保线程安全。通过访问 Singleton.Instance 属性,从而获取单例实例,这会触发 Lazy<T> 去执行构造函数。

执行结果:

86831e5b754447535eaa40f0344d5009.webp

调用的时候分两次调用,验证是否相等。并调用了类中的测试方法。从上图的测试结果可以看出他们的实例相同,并且方法成功调用。

是否实用呢?

Lazy<T> 能够实现单例模式也不一定代表实用,下面将介绍它的优缺点。

优势有如下几点:

1、延迟加载:对象只有在需要的时候才被创建,避免了不必要的性能开销。

2、线程安全:Lazy<T> 提供了线程安全的延迟加载,确保只有一个线程创建对象。

3、简洁性: 这里的简洁是相对复杂的单例模式,通过 Lazy<T>,可以简洁地实现单例模式,而不需要显式的双重检查锁定等复杂手段。

缺点:

使用 Lazy<T> 实现单例模式的缺点包括潜在的性能开销,延迟加载可能引入复杂性和增加代码难以维护的可能性。此外,全局可访问的单一实例可能导致不必要的耦合和全局状态,而且在多线程环境中可能引入死锁问题。需要仔细权衡利弊,确保 Lazy<T> 的使用符合应用程序的实际需求,并在考虑其他设计选项时保持警觉。

所以 在需要延迟加载、避免性能开销和确保线程安全的情况下,使用 Lazy<T> 实现单例模式。

结语

本文介绍了使用Lazy<T>实现单例模式的方法和案例,并归纳了 Lazy<T> 实现单例模式的实用性。大家都Lazy<T>实现单例模式有什么看法,欢迎留言讨论或者吐槽本文。

参考:

1、learn.microsoft.com/zh-cn/dotnet/api/system.lazy-1.-ctor?view=net-8.0

2、AI查询



    

关注公众号DotNet开发跳槽    

浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报