1.介绍
单例模式可以保证在整个应用程序中只有一个实例,这样可以避免多个实例对同一资源的访问冲突。在实现数据库连接池时,使用单例模式可以保证整个应用程序中只有一个连接池,这样可以更好地管理和分配数据库连接
单例模式目的是确保一个类只有一个实例,并提供一个全局访问点。在C++中,可以通过以下方式实现单例模式:
- 将构造函数、拷贝构造函数和赋值运算符声明为私有,以防止外部创建实例或复制实例。
- 在类中定义一个静态私有成员变量,用来存储唯一的实例。
- 提供一个公共的静态方法,用于获取唯一的实例。在这个方法中,如果实例不存在,则创建一个新的实例并返回;否则直接返回已有的实例
2.举例
现在举个简单例子来说明
class Singleton { private: static Singleton* instance; Singleton() {} Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; public: static Singleton* getInstance() { if (instance == nullptr) { instance = new Singleton(); } return instance; } }; Singleton* Singleton::instance = nullptr;
这种实现方式并不是线程安全的,如果需要在多线程环境中使用单例模式,可以使用双重检查锁定(double-checked locking)或其他线程安全的方法来保证线程安全
其中`Singleton* Singleton::instance = nullptr;` 这一行代码定义了一个静态成员变量 `instance`,并将其初始化为 `nullptr`。这意味着在程序开始运行时,`Singleton` 类的唯一实例尚未创建
静态成员变量是属于类的,而不是属于某个特定的对象。这意味着无论创建多少个 `Singleton` 对象,它们都共享同一个 `instance` 变量。在这种情况下,由于构造函数是私有的,所以无法直接创建 `Singleton` 对象,因此 `instance` 变量将始终指向唯一的实例
在 `getInstance()` 方法中,如果 `instance` 变量为 `nullptr`,则会创建一个新的 `Singleton` 实例并将其地址赋给 `instance` 变量。否则,直接返回 `instance` 变量指向的实例