当前位置:实例文章 » C#开发实例» [文章]【C#】五种单例模式详解

【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单例模式的优点是保证了实例的唯一性,并且延迟了实例的创建。

以上五种单例模式都是常见的设计模式,它们都有自己的优缺点和使用场景。选择哪种单例模式取决于具体的需求和环境。

其他信息

其他资源

Top