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

设计模式(一)

    • [单例模式(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. 适用场景

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

小结

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

相关推荐
TechNomad1 小时前
设计模式:模板方法模式(Template Method Pattern)
设计模式·模板方法模式
leo03083 小时前
7种流行Prompt设计模式详解:适用场景与最佳实践
设计模式·prompt
ytadpole6 小时前
揭秘设计模式:工厂模式的五级进化之路
java·设计模式
烛阴6 小时前
【TS 设计模式完全指南】用工厂方法模式打造你的“对象生产线”
javascript·设计模式·typescript
ArabySide7 小时前
【C#】 资源共享和实例管理:静态类,Lazy<T>单例模式,IOC容器Singleton我们该如何选
单例模式·c#·.net core
_请输入用户名9 小时前
EventEmitter 是广播,Tapable 是流水线:聊聊它们的本质区别
前端·设计模式
Buling_010 小时前
游戏中的设计模式——第一篇 设计模式简介
游戏·设计模式
小蜗牛在漫步10 小时前
设计模式六大原则2-里氏替换原则
设计模式·里氏替换原则
Ophelia(秃头版10 小时前
经典设计模式:单例模式、工厂模式
java·开发语言·单例模式
小蜗牛在漫步12 小时前
23种设计模式-Proxy模式
设计模式·代理模式