.NET单例模式的另类实现方式Lazy
简介
在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> 去执行构造函数。
执行结果:
调用的时候分两次调用,验证是否相等。并调用了类中的测试方法。从上图的测试结果可以看出他们的实例相同,并且方法成功调用。
是否实用呢?
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开发跳槽❀