单例模式是指在整个生命周期里,一个类只能实例化一次,该类是唯一的
单例模式可以分为懒汉模式和饿汉模式,
懒汉模式是指:系统运行时,实例不存在,只有在需要的时候才会去创建
饿汉模式是指:系统一运行,就创建实例,使用时直接调用即可
单例类特点:构造函数和析构都是private,防止在外部构造、析构;同理拷贝构造和赋值也是private的;单例类提供静态函数获取实例
一、懒汉模式
class singleton_test {
public:
static singleton_test* get_instance() {
if (pInstance_ == nullptr) {
pInstance_ = new singleton_test();
}
return pInstance_;
}
static void delete_instance() {
if (pInstance_ == nullptr) {
delete pInstance_;
pInstance_ = nullptr;
}
}
private:
singleton_test() {}
~singleton_test() {}
singleton_test(const singleton_test& other){}
singleton_test& operator=(const singleton_test& other){}
private:
static singleton_test* pInstance_;
};
singleton_test* singleton_test::pInstance_ = nullptr;
普通的懒汉模式,在多线程情况下,会发生多次创建,不是线程安全的,若想实现线程安全,则需要加锁。
class singleton_test {
public:
static singleton_test* get_instance() {
if (pInstance_ == nullptr) {
std::unique_lock<std::mutex> lk(mt_);
if (pInstance_ == nullptr) {
pInstance_ = new singleton_test();
}
}
return pInstance_;
}
static void delete_instance() {
std::unique_lock<std::mutex> lk(mt_);
if (pInstance_ == nullptr) {
delete pInstance_;
pInstance_ = nullptr;
}
}
private:
singleton_test() {}
~singleton_test() {}
singleton_test(const singleton_test& other){}
singleton_test& operator=(const singleton_test& other){}
private:
static singleton_test* pInstance_;
static std::mutex mt_;
};
singleton_test* singleton_test::pInstance_ = nullptr;
std::mutex singleton_test::mt_;
二、饿汉模式
class singleton_test {
public:
static singleton_test& get_instance() {
static singleton_test instance;
return instance;
}
private:
singleton_test() {}
~singleton_test() {}
singleton_test(const singleton_test& other){}
singleton_test& operator=(const singleton_test& other){}
};
饿汉模式是线程安全的,整个过程无需加锁。
懒汉是以时间换空间,适合访问量较小或者单线程,线程比较少的情况
饿汉是以空间换时间,适合访问量较大或者线程比较多的情况