C++ 单例模式实现
单例模式(Singleton Pattern)是一种常用的设计模式,它保证一个类只有一个实例,并提供一个全局访问点。
基本实现
懒汉式(线程不安全)
class Singleton { private:static Singleton* instance;// 私有构造函数防止外部实例化Singleton() {}public:// 删除拷贝构造函数和赋值运算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;} };// 初始化静态成员 Singleton* Singleton::instance = nullptr;
饿汉式(线程安全)
class Singleton { private:static Singleton instance;Singleton() {}public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton& getInstance() {return instance;} };// 在程序开始前就初始化 Singleton Singleton::instance;
线程安全的懒汉式实现
使用双重检查锁定(C++11及以上)
#include <mutex>class Singleton { private:static Singleton* instance;static std::mutex mtx;Singleton() {}public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mtx);if (instance == nullptr) {instance = new Singleton();}}return instance;} };Singleton* Singleton::instance = nullptr; std::mutex Singleton::mtx;
使用局部静态变量(C++11及以上,最简洁的线程安全实现)
class Singleton { private:Singleton() {}public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton& getInstance() {static Singleton instance;return instance;} };
单例模式的优缺点
优点:
确保一个类只有一个实例
提供全局访问点
避免频繁创建和销毁对象,节省系统资源
缺点:
违反单一职责原则(既管理实例又包含业务逻辑)
可能导致代码耦合度高
难以进行单元测试
在多线程环境下需要特殊处理
使用场景
需要频繁创建和销毁的对象
创建对象耗时或资源消耗大
工具类对象
访问数据库或文件的对象
在现代C++中,推荐使用局部静态变量的实现方式,它简洁且线程安全(C++11保证局部静态变量的初始化是线程安全的)。