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

设计模式(一)

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

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

小结

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

相关推荐
小白不太白95027 分钟前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in1 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in1 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
闲人一枚(学习中)1 小时前
设计模式-创建型-原型模式
设计模式
Iced_Sheep2 小时前
干掉 if else 之策略模式
后端·设计模式
哪 吒9 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10229 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
转世成为计算机大神12 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
小乖兽技术13 小时前
23种设计模式速记法
设计模式
小白不太白95014 小时前
设计模式之 外观模式
microsoft·设计模式·外观模式