.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开发跳槽    


浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报