【C#】五种单例模式详解
发布人:shili8
发布时间:2024-11-29 12:46
阅读次数:0
**五种单例模式详解**
在软件开发中,单例模式是一种常见的设计模式,它确保某个类只有一个实例,并提供全局访问点。下面我们将介绍五种不同的单例模式及其实现方式。
###1. 饿汉式单例模式饿汉式单例模式是最简单的一种单例模式。它在类加载时就创建了一个实例,供其他地方使用。
csharppublic class Singleton{ // 静态变量,保存唯一的实例 private static Singleton _instance = new Singleton(); // 私有构造函数,防止外部直接new private Singleton() { } // 提供全局访问点 public static Singleton GetInstance() { return _instance; } }
饿汉式单例模式的优点是简单易懂,但它在多线程环境下可能会出现问题,因为多个线程可能同时进入实例创建代码块,导致实例被重复创建。
###2. 懒汉式单例模式懒汉式单例模式与饿汉式类似,但它延迟了实例的创建。只有当外部需要实例时才会创建。
csharppublic class Singleton{ // 静态变量,保存唯一的实例 private static Singleton _instance; // 私有构造函数,防止外部直接new private Singleton() { } // 提供全局访问点 public static Singleton GetInstance() { if (_instance == null) { _instance = new Singleton(); } return _instance; } }
懒汉式单例模式的优点是延迟了实例的创建,减少了内存占用,但它在多线程环境下可能会出现问题,因为多个线程可能同时进入实例创建代码块,导致实例被重复创建。
###3. 双检锁单例模式双检锁单例模式是懒汉式单例模式的改进版。它使用了双检锁机制来保证实例的唯一性。
csharppublic class Singleton{ // 静态变量,保存唯一的实例 private static volatile Singleton _instance; // 私有构造函数,防止外部直接new private Singleton() { } // 提供全局访问点 public static Singleton GetInstance() { if (_instance == null) { lock (typeof(Singleton)) { if (_instance == null) { _instance = new Singleton(); } } } return _instance; } }
双检锁单例模式的优点是保证了实例的唯一性,但它在多线程环境下可能会出现问题,因为多个线程可能同时进入实例创建代码块,导致实例被重复创建。
###4. BillPugh单例模式BillPugh单例模式是双检锁单例模式的改进版。它使用了内部类来实现实例的延迟加载。
csharppublic class Singleton{ // 静态变量,保存唯一的实例 private static class SingletonHolder { public static readonly Singleton _instance = new Singleton(); } // 私有构造函数,防止外部直接new private Singleton() { } // 提供全局访问点 public static Singleton GetInstance() { return SingletonHolder._instance; } }
BillPugh单例模式的优点是保证了实例的唯一性,并且延迟了实例的创建。
###5. ThreadSafe单例模式ThreadSafe单例模式是使用线程安全机制来实现实例的唯一性的。
csharppublic class Singleton{ // 静态变量,保存唯一的实例 private static readonly object _lock = new object(); private static Singleton _instance; // 私有构造函数,防止外部直接new private Singleton() { } // 提供全局访问点 public static Singleton GetInstance() { if (_instance == null) { lock (_lock) { if (_instance == null) { _instance = new Singleton(); } } } return _instance; } }
ThreadSafe单例模式的优点是保证了实例的唯一性,并且延迟了实例的创建。
以上五种单例模式都是常见的设计模式,它们都有自己的优缺点和使用场景。选择哪种单例模式取决于具体的需求和环境。