C#实现单件模式的三种常用方法
在设计模式中,单件模式(Singleton Pattern)是一种常用的创建型设计模式,它能够确保一个类只有一个实例,并提供全局的访问点。在C#中,实现单件模式的方法比较多,本文将介绍其中的三种常用方法。
方法一:饿汉式(静态初始化)
饿汉式是最简单、常用的实现单件模式的方式之一。它在类加载时就创建了实例,因此线程安全,但是会增加启动时间和内存开销。
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
private Singleton() { }
public static Singleton Instance => instance;
}
方法二:懒汉式(双重锁定)
懒汉式是在需要时才创建实例,可以减少启动时间和内存开销。但是由于涉及到多线程处理,因此需要进行双重锁定以确保线程安全。
public sealed class Singleton
{
private static volatile Singleton instance;
private static readonly object syncRoot = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
方法三:静态内部类
静态内部类是在C#中比较少用到的实现单件模式的方式。它利用了类在初始化时同步的特性,可以保证线程安全。但是需要注意,该方式只能在.NET Framework 4.0及以上版本中使用。
public sealed class Singleton
{
private Singleton() { }
public static Singleton Instance => Nested.instance;
private class Nested
{
static Nested() { }
internal static readonly Singleton instance = new Singleton();
}
}
示例说明:
假设有一个日志记录器,我们需要确保它只有一个实例,可以采用单件模式进行实现。
public sealed class Logger
{
private static volatile Logger instance;
private static readonly object syncRoot = new object();
private Logger() { }
public static Logger Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Logger();
}
}
}
return instance;
}
}
public void Log(string message)
{
// 记录日志
}
}
调用示例:
var logger1 = Logger.Instance;
var logger2 = Logger.Instance;
Console.WriteLine(logger1 == logger2); // 输出:True
logger1.Log("Hello World!");
在以上示例中,我们通过Logger.Instance来获取唯一的Logger实例,然后记录日志信息,通过对比获取到的两个实例是否相等,验证了单件模式的正确性。
另外,在实现懒汉式时,采用的是双重锁定机制,即在获取实例前进行了一次检查,如果实例为空,则对类型进行锁定,再次检查实例是否为空,最后再创建实例。如果在lock语句之外进行检查,就有可能出现多个线程竞争创建实例的情况。
到这里为止,我们已经完整、详细地讲解了C#实现单件模式的三种常用方法,如果有不理解的地方可以提出来。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现单件模式的三种常用方法 - Python技术站