单例模式详解

单例模式

1. 概述

单例模式是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点以获取该实例。这种模式有助于控制资源的访问、管理全局配置或共享状态,确保系统中某个类只存在一个实例。

2. 目的

确保一个类仅有一个实例,且提供全局访问点,以便其他类可以轻松访问该实例。

3. 实现方式

3.1 懒汉式单例(Lazy Initialization)

懒汉式单例通过延迟实例化的方式,在第一次使用时才创建实例。这通常通过加锁来保证在多线程环境下只创建一个实例。

cs 复制代码
public class Singleton
{
    private static Singleton instance;
    private static readonly object lockObject = new object();
​
    private Singleton() { }
​
    public static Singleton Instance
    {
        get
        {
            lock (lockObject)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
            }
            return instance;
        }
    }
}

优点:

  • 延迟加载,节省资源。

缺点:

  • 多线程环境下可能会创建多个实例,需要使用锁机制保证线程安全。

3.2 饿汉式单例(Eager Initialization)

饿汉式单例在类加载时就创建实例,保证在任何线程访问之前已经存在一个实例。

cs 复制代码
public class Singleton
{
    private static readonly Singleton instance = new Singleton();
​
    private Singleton() { }
​
    public static Singleton Instance
    {
        get { return instance; }
    }
}

优点:

  • 在程序启动时就进行实例化,线程安全。

缺点:

  • 可能在程序启动时就占用资源。

3.3 双检锁/双重校验锁(Double-Checked Locking)

双检锁单例在检查实例是否存在时使用了两次检查,一次在没有锁的情况下,另一次在加锁的情况下。

cs 复制代码
public class Singleton
{
    private static Singleton instance;
    private static readonly object lockObject = new object();
​
    private Singleton() { }
​
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObject)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}

优点:

  • 在实例为 null 的情况下才进行加锁,提高性能。

缺点:

  • 需要考虑多线程情况下的双检查,确保线程安全。

3.4 静态初始化单例

静态初始化单例通过静态构造函数在类加载时完成实例化。

cs 复制代码
public class Singleton
{
    // 使用静态 readonly 字段确保线程安全的初始化
    private static readonly Singleton instance;
​
    // 私有构造函数,防止外部直接实例化
    private Singleton() { }
​
    // 静态构造函数用于初始化实例
    static Singleton()
    {
        instance = new Singleton();
    }
​
    // 全局访问点
    public static Singleton Instance
    {
        get { return instance; }
    }
}

优点:

  • 利用静态初始化的线程安全特性,保证了只有一个实例。

缺点:

  • 无法进行延迟加载,可能在程序启动时就占用资源。

4. 选择单例模式的需求和场景

选择单例模式的实现方式取决于具体的需求和应用场景。懒汉式和饿汉式适用于不同的情况,而双检锁和静态初始化单例则是对性能和资源占用的一些折中选择。在多线程环境下,需要特别注意实现的线程安全性,可以使用锁机制或者其他线程安全的方式来保证单例的唯一性。选择合适的单例模式实现,可以在系统中提供高效且唯一的实例。

相关推荐
代钦塔拉1 分钟前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式
十年Java程序媛2 分钟前
JVM 基础与 GC 垃圾回收详解|可达性分析、分代模型、垃圾收集器、STW
java·开发语言·jvm·spring boot·后端·面试
haluhalu.2 分钟前
深入理解AIAgent(1.3)--- 设计模式
人工智能·python·设计模式·langchain
估值探索者3 分钟前
【Python量化选股流水线 #03】候选股怎么排序?动量+低波+流动性三因子打分取 Top-N
开发语言·python·接口·api接口·股票数据接口·数据接口·股票数据api接口
骑士雄师3 分钟前
supervisor 中关于上下文多轮信息维护常用到的python语法
开发语言·python
曹牧13 分钟前
C#:字符串占位符与值数量不一致
开发语言·数据库·c#
迅猛龙办公室21 分钟前
Python函数实现反转一个只有3位数的整数
开发语言·前端·python
“AI国潮设计-小江”23 分钟前
《【AIGC实战】Python+SDXL批量生成“英歌舞树莓香草布丁”IP,附保持角色一致性的代码逻辑》
开发语言·人工智能·python·prompt·aigc
闻缺陷则喜何志丹29 分钟前
【C++特性及类库】多线程
开发语言·c++·多线程·语言特性·系统库
dtq042442 分钟前
C++3 - 分支语句if和string变量
开发语言·c++·学习