【软件设计】常用设计模式--单例模式

设计模式(一)

    • [单例模式(Singleton Pattern)](#单例模式(Singleton Pattern))
      • [1. 概念](#1. 概念)
      • [2. 单例模式的特点](#2. 单例模式的特点)
      • [3. 实现方式](#3. 实现方式)
      • [4. 线程安全的单例模式](#4. 线程安全的单例模式)
        • [C# 中的线程安全单例](# 中的线程安全单例)
        • [Java 中的线程安全单例](#Java 中的线程安全单例)
      • [5. 优点](#5. 优点)
        • [6. 缺点](#6. 缺点)
      • [7. 适用场景](#7. 适用场景)
      • 小结

单例模式(Singleton Pattern)

1. 概念

单例模式的核心目标是确保一个类只有一个实例,并提供一个全局访问点。这意味着无论何时何地,你都可以访问到同一个对象实例。

2. 单例模式的特点

  • 唯一性: 只允许一个实例存在。
  • 延迟初始化: 实例在第一次使用时创建,而不是在程序启动时创建,节省资源。
  • 全局访问: 通过一个全局方法来获取唯一的实例,通常是静态方法。

3. 实现方式

在不同的编程语言中,单例模式的实现可能略有不同。下面是C#和Java中的实现示例。

C#实现
c# 复制代码
public class Singleton
{
    private static Singleton _instance;

    // 私有构造函数,防止外部实例化
    private Singleton() { }

    // 公共静态方法,提供全局访问点
    public static Singleton Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new Singleton();
            }
            return _instance;
        }
    }

    public void DoSomething()
    {
        Console.WriteLine("Singleton instance is working.");
    }
}

访问实例 : Singleton.Instance.DoSomething();

Java实现
java 复制代码
public class Singleton {
    private static Singleton instance;

    // 私有构造函数,防止外部实例化
    private Singleton() { }

    // 公共静态方法,提供全局访问点
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public void doSomething() {
        System.out.println("Singleton instance is working.");
    }
}

访问实例 : Singleton.getInstance().doSomething();

4. 线程安全的单例模式

在多线程环境中,如果多个线程同时调用获取实例的方法,可能会创建多个实例。为了解决这个问题,我们需要在单例模式中加入线程安全的机制。

C# 中的线程安全单例

使用双重检查锁定(Double-Checked Locking)来确保线程安全:

c# 复制代码
public class Singleton
{
    private static Singleton _instance;
    private static readonly object _lock = new object();

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new Singleton();
                    }
                }
            }
            return _instance;
        }
    }
}
Java 中的线程安全单例

可以使用volatile关键字和双重检查锁定来实现:

java 复制代码
public class Singleton {
    private static volatile Singleton instance;

    private Singleton() { }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

5. 优点

  • 内存效率: 单例模式只创建一个实例,节省内存。
  • 全局访问: 提供全局访问点,方便管理和控制全局资源。
6. 缺点
  • 不易测试: 因为单例类紧耦合于它的唯一实例,可能导致单元测试困难。
  • 隐藏的依赖: 单例模式的全局访问点可能使得依赖关系不明显,增加代码复杂性。

7. 适用场景

  • 资源管理: 如线程池、数据库连接池等,需要全局唯一实例来管理资源。
  • 配置管理: 应用程序配置通常需要全局访问,并且在整个生命周期中只存在一个配置实例。

小结

掌握了单例模式的基本原理和实现,可以尝试在实际项目中应用它,或者探索如何将其与其他设计模式组合使用。

相关推荐
阿星AI工作室34 分钟前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦20 小时前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo4 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4964 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃4 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20104 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈4 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||5 天前
安装依赖三方exe/msi的软件设计模式
设计模式
希望_睿智5 天前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香5 天前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式