在C#中,单例模式(Singleton Pattern)用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式常用于需要限制某个类只能创建一个对象的场景,例如数据库连接、日志记录器等。
- 懒汉式(Lazy Initialization)
这种实现方式使用了双重检查锁定(双IF加锁),即在获取实例前先检查实例是否已经存在,如果不存在再使用锁进行同步。这种方式延迟了实例的创建,只有在需要使用实例时才会进行创建。该实现是线程安全的,并且能够在多线程环境下保证只有一个实例。
public class Singleton { private static Singleton instance; private static readonly object lockObj = new object(); private Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (lockObj) { if (instance == null) { instance = new Singleton(); } } } return instance; } } }
- 饿汉式(Eager Initialization)
这种实现方式在类加载时就创建了实例,所以称为饿汉式。在多线程环境下也能保证只有一个实例,但可能会在程序启动时就创建实例,有一定的内存开销。
public class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton Instance { get { return instance; } } }
- 静态构造函数(Static Constructor)
这种实现方式利用了C#的静态构造函数,在第一次使用Singleton类时执行静态构造函数并创建实例。它也能保证在多线程环境下只有一个实例。public class Singleton { private static readonly Singleton instance; private Singleton() { } static Singleton() { instance = new Singleton(); } public static Singleton Instance { get { return instance; } } }