C++设计模式-单例模式
文章目录
一、概念
单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例:
- 保证一个类仅有一个实例
- 提供一个访问它的全局访问点
- 该实例被所有程序模块所共享
二、应用场景
单例模式的主要作用是确保一个类只有一个实例存在。单例模式可以用在建立目录、数据库连接等需要单线程操作的场合,用于实现对系统资源的控制。
三、定义方式
- 私有化构造函数,以防止外界创建单例类的对象
- 不需用拷贝和赋值,在单例模式中,始终只有一个对象
- 提供一个自身的静态私有成员变量,以指向类的实例
- 使用一个公有的静态方法获取该实例
四、实现方式
- 解法一:基础懒汉式单例——单线程安全,多线程不安全
- 解法二:加锁懒汉式单例——效率低
- 解法三:对解法二的一个优化
- 解法四:饿汉式单例——线程安全
- 解法五:利用C++11的magic static特性实现的Meyers Singleton,安全,推荐
4.1 基础懒汉式单例
示例:
#include <iostream>
/**
* @brief 基本懒汉式单例(非线程安全)
* 由于要求只生成一个实例,因此必须把构造函数设为私有函数,以禁止他人创建实例
* 可以定义一个静态的实例,在需要的时候创建该实例
* 缺点:多线程情况下,不同线程可能创建出不同的Singleton实例
*/
class Singleton {
public:
static Singleton* getInstance() {
if (instance_ == nullptr) {
instance_ = new Singleton();
}
return instance_;
}
static void destroyInstance() {
if (instance_ != nullptr) {
delete instance_;
instance_ = nullptr;
}
}
void todo() {
std::cout << "Singleton do ..." << std::endl; }
private:
Singleton() = default; // 默认构造
~Singleton() = default; // 默认析构
Singleton(const Singleton&) = delete; // 删除拷贝构造
Singleton& operator=(const Singleton&) = delete; // 删除拷贝赋值
Singleton(Singleton&&) = delete; // 删除移动构造
Singleton& operator=(Singleton&&) = delete; // 删除移动赋值
private:
static Singleton* instance_;
};
// 初始化
Singleton* Singleton::instance_ = nullptr;
// test
int main() {
Singleton::getInstance()->todo(