电子商务网站开发人员要求,建设工程设计招标信息网站.,163企业邮箱免费注册,wordpress页面禁止评论单例模式 (Singleton)
概念
单例模式 确保一个类在整个程序生命周期中只有一个实例#xff0c;并提供一个全局访问点。 它是一种创建型设计模式#xff0c;广泛用于需要共享资源的场景。 使用场景
配置管理器#xff1a;程序中需要一个全局的配置对象。日志系统#xff…单例模式 (Singleton)
概念
单例模式 确保一个类在整个程序生命周期中只有一个实例并提供一个全局访问点。 它是一种创建型设计模式广泛用于需要共享资源的场景。 使用场景
配置管理器程序中需要一个全局的配置对象。日志系统确保日志记录器只有一个实例。数据库连接池共享一个数据库连接实例。 实现单例模式的要点
私有构造函数防止外部通过 new 操作符创建实例。静态成员变量保存类的唯一实例。静态方法提供全局访问点。线程安全确保多线程环境下实例只有一个。 示例代码线程安全的单例模式
#include iostream
#include mutex// 单例类定义
class Singleton {
private:// 静态实例指针用于保存唯一实例static Singleton* instance;// 互斥锁保证多线程环境下的线程安全static std::mutex mtx;// 私有构造函数禁止外部实例化Singleton() {std::cout Singleton Created! std::endl;}public:// 禁止拷贝构造和赋值操作Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;// 静态方法用于获取唯一实例static Singleton* getInstance() {// 双重检查锁定减少锁的开销if (instance nullptr) {std::lock_guardstd::mutex lock(mtx); // 加锁if (instance nullptr) {instance new Singleton(); // 创建唯一实例}}return instance;}// 提供一些功能方法void doSomething() {std::cout Singleton is working! std::endl;}// 销毁实例可选static void destroyInstance() {delete instance;instance nullptr;}
};// 静态成员变量初始化
Singleton* Singleton::instance nullptr;
std::mutex Singleton::mtx;// 主函数测试单例模式
int main() {// 获取单例实例Singleton* s1 Singleton::getInstance();Singleton* s2 Singleton::getInstance();// 调用单例方法s1-doSomething();// 检查两个实例是否相同std::cout Are s1 and s2 the same? (s1 s2 ? Yes : No) std::endl;// 销毁单例实例Singleton::destroyInstance();return 0;
}代码详解
1. 私有化构造函数
目的禁止通过 new 操作符创建实例。
Singleton() {std::cout Singleton Created! std::endl;
}2. 静态成员变量
保存唯一的单例实例初始值为 nullptr。
static Singleton* instance;3. 互斥锁
确保在多线程环境下多个线程不会同时创建实例。
static std::mutex mtx;4. 静态方法 getInstance
提供唯一实例的全局访问点。双重检查锁定减少锁的开销提高性能。
static Singleton* getInstance() {if (instance nullptr) {std::lock_guardstd::mutex lock(mtx);if (instance nullptr) {instance new Singleton();}}return instance;
}5. 销毁实例
可选在程序结束时清理单例实例。
static void destroyInstance() {delete instance;instance nullptr;
}运行结果
执行代码输出
Singleton Created!
Singleton is working!
Are s1 and s2 the same? Yes单例模式的优缺点
优点
全局唯一实例确保实例唯一性。延迟初始化实例在第一次使用时才会创建。线程安全双重检查锁定保证线程安全。
缺点
难以测试单例模式引入全局状态可能影响单元测试。不适合频繁访问的场景线程安全的实现有一定性能开销。内存泄漏风险如果程序结束时未释放实例可能造成内存泄漏。 适合扩展的改进
懒汉式与饿汉式可选择延迟初始化懒汉式或直接初始化饿汉式。智能指针管理用 std::unique_ptr 管理单例实例避免内存泄漏。多线程优化采用 C11 的 std::call_once 确保线程安全。