单例模式通过私有构造函数、静态实例和全局访问点确保类唯一实例,常用静态初始化或双重检查锁实现线程安全,适用于日志、配置管理等场景,应避免滥用以降低耦合。

单例模式的核心在于确保一个类只有一个实例,并提供一个全局访问点。C++实现单例的关键在于控制对象的创建和访问。
下面是一个简单的C++单例模式实现:
#include <iostream>
#include <mutex>
class Singleton {
private:
Singleton() {
std::cout << "Singleton created" << std::endl;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton* instance;
static std::mutex mutex;
public:
static Singleton* getInstance() {
std::lock_guard<std::mutex> lock(mutex);
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
void doSomething() {
std::cout << "Singleton is doing something" << std::endl;
}
~Singleton() {
std::cout << "Singleton destroyed" << std::endl;
}
//防止内存泄漏
class Garbo {
public:
~Garbo(){
if (Singleton::instance != nullptr) {
delete Singleton::instance;
Singleton::instance = nullptr;
}
}
};
static Garbo garbo;
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
Singleton::Garbo Singleton::garbo;
int main() {
Singleton* instance1 = Singleton::getInstance();
instance1->doSomething();
Singleton* instance2 = Singleton::getInstance();
instance2->doSomething();
if (instance1 == instance2) {
std::cout << "Both instances are the same" << std::endl;
}
//不需要手动释放,程序结束时会自动释放
return 0;
}这段代码首先私有化了构造函数和拷贝构造函数,阻止了外部直接实例化和复制
Singleton
getInstance
Garbo
在高并发环境下,多个线程可能同时调用
getInstance
立即学习“C++免费学习笔记(深入)”;
双重检查锁(Double-Checked Locking)是一种常用的线程安全单例模式实现方式,但需要注意内存模型问题。在C++11之后,由于内存模型的改进,双重检查锁可以正确工作。
除了互斥锁,还可以使用静态初始化来保证线程安全。静态变量的初始化在C++标准中是线程安全的,因此可以利用这一特性来简化单例模式的实现:
class Singleton {
private:
Singleton() {
std::cout << "Singleton created" << std::endl;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static Singleton& getInstance() {
static Singleton instance; // 静态初始化,线程安全
return instance;
}
void doSomething() {
std::cout << "Singleton is doing something" << std::endl;
}
~Singleton() {
std::cout << "Singleton destroyed" << std::endl;
}
};
int main() {
Singleton& instance1 = Singleton::getInstance();
instance1.doSomething();
Singleton& instance2 = Singleton::getInstance();
instance2.doSomething();
if (&instance1 == &instance2) {
std::cout << "Both instances are the same" << std::endl;
}
return 0;
}这种方式更加简洁,并且依赖于C++标准的线程安全保证。
单例模式常用于以下场景:
在这些场景中,使用单例模式可以确保全局只有一个实例,避免资源浪费和数据不一致的问题。
单例模式虽然有用,但过度使用会导致代码的耦合度增加,测试难度加大。因此,需要谨慎使用单例模式,避免滥用。
以下是一些建议:
总之,单例模式是一种有用的设计模式,但需要谨慎使用,避免滥用。选择合适的设计模式,才能编写出高质量的代码。
以上就是C++如何实现单例模式保证全局唯一对象的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号