设计模式1:单例模式
作者:
jokerlove
,
2022-09-15 20:13:02
,
所有人可见
,
阅读 186
单例模式:一个类不管创建多少个对象,永远只能得到该类型的一个对象示例
使用场景:日志模块,数据库模块
饿汉式单例模式:还没有获取实例对象时,实例对象就已经产生了
一定是线程安全的,先于main之前实例化
懒汉式单例模式:直到第一次获取实例对象时,才产生
优势是随用随创建,灵活
饿汉式单例模式
class Singleton
{
private:
static Singleton instance; // 定义唯一的类的实例化对象instance,注意static
Singleton() {} // 需要将构造函数私有化
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete; //必须要三条路堵死创建新对象的方法
public:
static Singleton* getInstance() // 需要一个静态get方法获取唯一的私有实例化对象
{
return &instance;
}
};
Singleton Singleton::instance; // static函数需要在类外初始化
int main()
{
Singleton* p1 = Singleton::getInstance();
Singleton* p2 = Singleton::getInstance(); // 不管创建几个对象,都是指向同一个实例化对象instance
//Singleton tmp = *p1; // 如果不限制拷贝构造和赋值重载,那依然可以创建新对象tmp
return 0;
}
懒汉式单例模式1(线程安全版)
#include <mutex>
std::mutex mtx;
class Singleton
{
private:
static Singleton* instance;
Singleton() {} // 4因为构造中有一些复杂的操作,不需要出门就构造,需要再构建是最好的
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static Singleton* volatile getInstance()
{
if (instance == nullptr)
{
lock_guard<std::mutex> grard(mtx); // 加锁确保单线程多线程都只有第一次才构造
if (instance == nullptr)
instance = new Singleton; // 3才开始构造对象
}
return instance;
}
};
Singleton* Singleton::instance = nullptr; // 1默认初始化为空
int main()
{
Singleton* p = Singleton::getInstance(); // 2什么时候突然要用这个对象
return 0;
}
懒汉式单例模式2(线程安全版)(推荐)
class Singleton
{
private:
static Singleton* instance;
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static Singleton* getInstance()
{
// 函数静态局部变量的初始化,在汇编指令上自动添加线程互斥指令
static Singleton instance;
return &instance;
}
};
Singleton* Singleton::instance = nullptr;
int main()
{
Singleton* p = Singleton::getInstance();
return 0;
}