一、概念
保证一个类只有一个实例,并提供一个访问它的全局访问点。在单例模式中,类通常会提供一个静态方法,该方法负责创建(懒汉式)或返回(饿汉式)类的唯一实例。
二、结构图
三、代码实现
实现方式一:懒汉式,双重锁定
class Singleton
{
private static Singleton Instance;
private static readonly object syncRoot = new object();
// 构造方法私有化,防止外部实例化类
private Singleton() { }
// 提供获取实例的方法
public static Singleton GetInstance()
{
if (Instance == null)
{
// 程序运行时只有一个线程可以进入
lock (syncRoot)
{
if (Instance == null)
{
Instance = new Singleton();
}
}
}
return Instance;
}
}
实现方式二:饿汉式
// sealed 修饰为最终类,防止继承出现子类
public sealed class Singleton
{
private static readonly Singleton Instance = new Singleton();
// 构造方法私有化,防止外部实例化类
private Singleton() { }
// 提供获取实例的方法
public static Singleton GetInstance()
{
return Instance;
}
}
四、单例模式的优点
- 提供对唯一实例的全局访问,方便在整个应用程序中共享数据和资源
- 避免了重复创建实例,节省了系统资源
- 隐藏了实例化的细节,提供了一种封装机制
五、应用场景
- 日志记录器(Logger) :在应用程序中使用单例模式创建一个全局的日志记录器,以便在整个应用程序中记录日志信息
- 数据库连接池:在多线程环境下管理数据库连接时,可以使用单例模式创建一个连接池,以确保只有一个连接池实例,并提供对连接的统—管理和复用
- 配置信息管理:单例模式可用于加载和管理应用程序的配置信息,例如读取配置文件、从数据库中获取配置数据等。
- 缓存管理器:在需要缓存数据的场景中,可以使用单例模式创建一个缓存管理器,用于统一管理和存储缓存数据。
- 线程池:在多线程编程中,可以使用单例模式创建一个线程池,以便在整个应用程序中共享和管理线程资源。
- GUI应用程序中的窗口管理:在图形用户界面(GUI)应用程序中,可以使用单例模式来管理应用程序的主窗口或对话框,确保只有一个实例存在。
- Web应用程序中的应用上下文:在Web开发中,可以使用单例模式创建一个应用上下文对象,用于在整个应用程序中共享数据和状态。