单例模式

119 阅读2分钟

一、概念

保证一个类只有一个实例,并提供一个访问它的全局访问点。在单例模式中,类通常会提供一个静态方法,该方法负责创建(懒汉式)或返回(饿汉式)类的唯一实例。

二、结构图

image.png

三、代码实现

实现方式一:懒汉式,双重锁定

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;
    }
}

四、单例模式的优点

  1. 提供对唯一实例的全局访问,方便在整个应用程序中共享数据和资源
  2. 避免了重复创建实例,节省了系统资源
  3. 隐藏了实例化的细节,提供了一种封装机制

五、应用场景

  1. 日志记录器(Logger) :在应用程序中使用单例模式创建一个全局的日志记录器,以便在整个应用程序中记录日志信息
  2. 数据库连接池:在多线程环境下管理数据库连接时,可以使用单例模式创建一个连接池,以确保只有一个连接池实例,并提供对连接的统—管理和复用
  3. 配置信息管理:单例模式可用于加载和管理应用程序的配置信息,例如读取配置文件、从数据库中获取配置数据等。
  4. 缓存管理器:在需要缓存数据的场景中,可以使用单例模式创建一个缓存管理器,用于统一管理和存储缓存数据。
  5. 线程池:在多线程编程中,可以使用单例模式创建一个线程池,以便在整个应用程序中共享和管理线程资源。
  6. GUI应用程序中的窗口管理:在图形用户界面(GUI)应用程序中,可以使用单例模式来管理应用程序的主窗口或对话框,确保只有一个实例存在。
  7. Web应用程序中的应用上下文:在Web开发中,可以使用单例模式创建一个应用上下文对象,用于在整个应用程序中共享数据和状态。