【设计模式】单例模式

单例模式(Singleton Pattern)

概念:

· 确保一个类只有一个实例,并提供一个全局访问点来获取该实例;

· 限制类实例的数量为 1

· 提供一个静态方法来获取唯一实例;

UML结构:

复制代码
        Client
           |
        Singleton
           |
    -----------------
    | -instance     |
    | +GetInstance()|
    -----------------

代码示例:

cs 复制代码
/// <summary>
/// 单例模式(懒汉式)
/// </summary>
public class SingletonMono1
{
    private static readonly object instanceLocked = new();
    private static SingletonMono1 _instance;
    public static SingletonMono1 Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (instanceLocked)
                {
                    if (_instance == null)
                    {
                        _instance = new();
                    }
                }
            }

            return _instance;
        }
    }

    // 私有化构造函数(默认为public)
    private SingletonMono1() { }
}

/// <summary>
/// 单例模式(饿汉式)
/// </summary>
public class SingletonMono2
{
    private static SingletonMono2 _instance = new SingletonMono2();
    public static SingletonMono2 Instance => _instance;

    // 私有化构造函数(默认为public)
    private SingletonMono2() { }
}

特点:
优点:

· 唯一实例 :全局只有一个对象,避免资源浪费;

· 全局访问点 :提供统一的入口访问实例;

· 懒加载 :可以在第一次使用时再创建实例,节省性能;
缺点:

· 难以扩展 :单例类一般不能被继承;

· 隐藏依赖 :全局使用单例可能造成代码耦合度高;

· 多线程问题 :如果实现不当,可能在多线程环境下出现多个实例;

· 不利于测试 :因为是全局对象,可能导致单元测试难以编写(可能很多因素在同时改变着这个单例);

适用场景:

· 全局唯一资源 :某个类在系统中只需要一个实例;

· 频繁访问共享资源 :需要统一控制访问,避免重复创建;

· 需要全局配置管理 :比如配置文件、日志系统;

示例:

· 日志管理器 :整个系统中只需要一个日志对象,负责统一记录日志,避免文件句柄冲突;

· 配置类 :应用启动时读取一次配置文件,后续都用单例对象来访问配置数据;

· 线程池 :系统中只需要一个线程池来管理线程;

· 数据库连接池:避免每次都创建和销毁数据库连接,统一由单例管理连接池;

相关推荐
tobebetter95271 小时前
How to manage python versions on windows
开发语言·windows·python
在未来等你1 小时前
AI Agent设计模式 Day 19:Feedback-Loop模式:反馈循环与自我优化
设计模式·llm·react·ai agent·plan-and-execute
9***P3342 小时前
PHP代码覆盖率
开发语言·php·代码覆盖率
CoderYanger2 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
jllllyuz2 小时前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
多多*2 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
p***43483 小时前
Rust网络编程模型
开发语言·网络·rust
ᐇ9593 小时前
Java集合框架深度实战:构建智能教育管理与娱乐系统
java·开发语言·娱乐
梁正雄3 小时前
1、python基础语法
开发语言·python
强化学习与机器人控制仿真4 小时前
RSL-RL:开源人形机器人强化学习控制研究库
开发语言·人工智能·stm32·神经网络·机器人·强化学习·模仿学习