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

设计模式(一)

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

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

小结

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

相关推荐
melonbo1 小时前
代理模式C++
c++·设计模式·系统安全·代理模式
Tina学编程2 小时前
线程P5 | 单例模式[线程安全版]~懒汉 + 饿汉
java·单例模式·线程安全
我们从未走散2 小时前
设计模式学习笔记-----单例模式
java·笔记·学习·单例模式·设计模式
long3164 小时前
java 工厂方法设计模式 FactoryMethod
java·开发语言·后端·设计模式
找不到、了8 小时前
Java设计模式之《原型模式》--深、浅copy
java·设计模式·原型模式
pengzhuofan11 小时前
Java设计模式-建造者模式
java·设计模式·建造者模式
找不到、了12 小时前
Java设计模式之《策略模式》
java·设计模式·策略模式
刘火锅12 小时前
设计模式-策略模式 Java
java·设计模式·策略模式
小恶魔巴巴塔13 小时前
设计模式(2)
设计模式
集成显卡21 小时前
在JVM跑JavaScript脚本 | 简单 FaaS 架构设计与实现
开发语言·javascript·jvm·设计模式·kotlin·软件开发·faas