单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。在软件开发中,这种设计模式被广泛使用来管理对以下资源的独占访问:配置对象、日志对象、线程池、硬件资源等。
-
唯一性:类负责创建自己的实例,并确保这个类只有一个实例存在。通过私有构造函数防止其他对象创建新实例。
-
全局访问点:单例类提供了一个静态方法或函数,让外部代码可以访问类的唯一实例,通常通过一个叫做
getInstance()的方法来完成。
#include <iostream>
#include <mutex>
class Singleton {
public:
// 禁止拷贝构造和赋值操作
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
// 获取单例实例的静态方法
static Singleton& getInstance() {
static Singleton instance; // C++11 线程安全的懒汉式单例
return instance;
}
void doSomething() {
std::cout << "Doing something in the Singleton instance." << std::endl;
}
private:
// 私有构造函数
Singleton() {
std::cout << "Singleton constructor called." << std::endl;
}
// 可以添加其他私有成员
// std::mutex mutex; // 如果需要互斥锁保护其他成员
};
int main() {
Singleton& instance = Singleton::getInstance();
instance.doSomething();
// 再次获取实例不会创建新的对象
Singleton& anotherInstance = Singleton::getInstance();
anotherInstance.doSomething();
return 0;
}
特点:
-
内存效率:单例模式延迟实例化,即在第一次需要该类的实例时进行创建(懒汉式),可以优化内存使用。
-
线程安全性:对于多线程环境,使用 C++11 的局部静态变量,可以实现线程安全的懒汉式单例,以保证只有一个实例被创建。
-
禁止复制:通过禁止拷贝构造和复制操作符,确保不能通过复制生成实例。
场景:
-
配置管理:系统级配置管理,一旦初始化后,全局的任何客户端都使用同一份配置实例。
-
资源控制:想要强制控制某个资源的访问,如具体硬件设备、日志记录和连接池等。
-
日志记录系统:无需多次实例化日志对象,在系统中任何地方都可以使用单实例进行日志记录。
注意事项:
-
多线程问题:确保线程安全,尤其是在首次创建对象时。
-
生命周期:程序生命周期结束后,单例对象通常会自动被销毁,对于某些资源需要显式回收的场景要留心处理。
-
全局状态管理:避免过度使用单例,以防止系统出现难以维护的隐藏全局状态或副作用。
单例模式是一个强大而有用的模式,但应当谨慎使用以免使代码的可测试性和可维护性降低。
2614

被折叠的 条评论
为什么被折叠?



