【设计模式】单例模式

单例模式(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() { }
}

特点:
优点:

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

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

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

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

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

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

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

适用场景:

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

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

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

示例:

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

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

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

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

相关推荐
徐先生 @_@|||20 分钟前
(Wheel 格式) Python 的标准分发格式的生成规则规范
开发语言·python
利剑 -~24 分钟前
jdk源码解析
java·开发语言
烛阴29 分钟前
C# 正则表达式:量词与锚点——从“.*”到精确匹配
前端·正则表达式·c#
Predestination王瀞潞30 分钟前
JDK安装及环境变量配置
java·linux·开发语言
lsx20240635 分钟前
Python break 语句详解
开发语言
hmbbcsm35 分钟前
python做题小记(八)
开发语言·c++·算法
wyzqhhhh1 小时前
京东啊啊啊啊啊
开发语言·前端·javascript
JIngJaneIL1 小时前
基于java+ vue助农电商系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
雷中听风1 小时前
使用字节的源安装rust
开发语言·后端·rust
特立独行的猫a2 小时前
C++开发中的Pimpl机制与类声明机制深度解析:现代C++的编译解耦艺术
开发语言·c++·pimpl