问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

设计模式-5.单例(Singleton)C++实现

创作时间:
作者:
@小白创作中心

设计模式-5.单例(Singleton)C++实现

引用
CSDN
1.
https://blog.csdn.net/qq_39071254/article/details/138992224

单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制资源访问或配置全局状态的场景中非常有用。本文将详细介绍单例模式的概念、实现方法以及使用时需要注意的问题。

5.设计模式名称:单例(Singleton)

概念
单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式确保全局有一个单一的实例,并且这个实例可以在整个程序中方便地访问。

意图

  • 确保一个类仅有一个实例,并提供一个全局访问点。
  • 控制资源的访问,如数据库或文件的连接。

适用性

  • 当类只能有一个实例而客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需修改代码就能使用一个扩展的实例时。

结构
单例模式通常只涉及一个角色:

  1. Singleton:负责创建自己的唯一实例,并提供一个访问该实例的全局访问点。

实现代码示例
以下是使用 C++ 实现单例模式的一个示例,它包含线程安全的懒加载(延迟实例化)机制:

#include <iostream>
#include <mutex>

// Singleton
class Singleton {
private:
    static Singleton *instance;
    static std::mutex mutex;
protected:
    Singleton() = default;
    ~Singleton() = default;
    Singleton(const Singleton &) = delete;
    Singleton &operator=(const Singleton &) = delete;
public:
    static Singleton *getInstance() {
        std::lock_guard<std::mutex> lock(mutex);
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
    void doSomething() {
        std::cout << "Doing something..." << std::endl;
    }
};

// 必须在类外定义静态变量
Singleton *Singleton::instance = nullptr;
std::mutex Singleton::mutex;

// Client code
int main() {
    Singleton *singleton = Singleton::getInstance();
    singleton->doSomething();
    return 0;
}

输出

Doing something...

在这个示例中,Singleton 类包含一个静态私有成员 instance,它持有类的唯一实例。getInstance() 方法提供了一个全局访问点,并使用互斥锁确保多线程环境下的线程安全。doSomething() 方法是 Singleton 类的一个实例方法,可以通过全局访问点调用。

特点与考虑
单例模式提供了对唯一实例的严格控制,但也有一些潜在的问题需要考虑:

  • 单例可能成为一个全局变量,使得代码之间的耦合度增加。
  • 在多线程环境下,确保线程安全可能导致性能下降。
  • 单例的生命周期通常贯穿整个程序,可能导致资源回收和管理上的复杂性。

这种模式在需要控制资源访问或配置全局状态的场景中非常有用,但应谨慎使用,以避免过度依赖全局状态。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号