单例模式:一个类不管创建多少次对象,永远只能得到该类型的一个对象实例
比如日志模块,数据库模块,
饿汉式单例模式:还没有获取实例对象,实例对象就已经产生
懒汉式单例模式:唯一的实例对象,知道第一次获取它的时候,才产生
1首先要先限制构造函数的访问方式 要限制对象的访问次数 所以第一步就是构造函数私有化
2.定义一个唯一的实例对象
3.定义一个接口 用户通过接口来获取的唯一实例对象的接口 要当以成静态的 (普通成员的方法调用依赖对象 因为静态成员方法通过类名调用不用依赖于对象)
//这是饿汉式单例模式 是线程安全的
#include <iostream>
class Singleton {
public:
static Singleton* getInstance() {
return &instance;
}
private:
static Singleton instance;
Singleton() {} // 私有构造函数
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
Singleton Singleton::instance;
int main() {
Singleton* p1 = Singleton::getInstance();
Singleton* p2 = Singleton::getInstance();
Singleton* p3 = Singleton::getInstance();
std::cout << "p1: " << p1 << std::endl;
std::cout << "p2: " << p2 << std::endl;
std::cout << "p3: " << p3 << std::endl; // 打印结果都是一样的
return 0;
}
懒汉式是存在线程安全的 。
- 在多线程环境下,多个线程可能同时进入
if(instance == nullptr)
判断语句,导致多个线程同时创建Singlento
对象,从而破坏单例模式。
class Singleton {
public:
static Singleton* getInstance() {
std::lock_guard<std::mutex> lock(mutex); // 使用互斥锁
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
private:
static Singleton* instance;
static std::mutex mutex; // 静态互斥锁
Singleton() {} // 私有构造函数
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
int main() {
Singleton* p1 = Singleton::getInstance();
Singleton* p2 = Singleton::getInstance();
Singleton* p3 = Singleton::getInstance();
std::cout << "p1: " << p1 << std::endl;
std::cout << "p2: " << p2 << std::endl;
std::cout << "p3: " << p3 << std::endl; // 打印结果都是一样的
return 0;
}