目录
简介
单例模式,通过创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例)
自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
实现方式
1.将默认构造函数设为私有,防止其他对象使用单例类的new运算符
2.新建一个静态构造方法作为构造函数。该函数调用私有构造函数来创建对象,并将其保存在一个静态成员变量中。此后所有对于该函数的调用都将返回这一缓存对象。
优点
1.可以保证一个类只有一个实例
2.获得了一个指向该实例的全局访问点
3.仅在首次请求单例对象时对其进行初始化
缺点
1.违反了单一职责原则。
2.多线程避免多次创建单例对象。
懒汉式
需要的时候才会创建
1.线程不安全,如果两个线程同时调用getsinstance的话,第一个被创建的会被第二个覆盖,并且第一个申请的空间没有释放,造成内存泄漏。
#include <iostream>
#include <string>
#include <mutex>
using namespace std;
class Singleton {
public:
static Singleton* GetInstance() {
if (instance_ == nullptr)
instance_ = new Singleton();
return instance_;
}
private:
Singleton(){}
static Singleton* instance_;
};
Singleton* Singleton::instance_ = nullptr;
int main()
{
Singleton* s1 = Singleton::GetInstance();
Singleton* s2 = Singleton::GetInstance();
cout << "s1的地址" << (int)s1 << endl;
cout << "s2的地址" << (int)s2 << endl;
return 0;
}
2.线程安全,进行加锁
#include <iostream>
#include <string>
#include <mutex>
using namespace std;
class Singleton {
public:
static Singleton* GetInstance() {
if (instance_ == nullptr)
{
m_mutex.lock();
if(instance_==nullptr)
instance_ = new Singleton();
m_mutex.unlock();
}
return instance_;
}
private:
Singleton(){}
static Singleton* instance_;
static mutex m_mutex;
};
Singleton* Singleton::instance_ = nullptr;
mutex Singleton::m_mutex;
int main()
{
Singleton* s1 = Singleton::GetInstance();
Singleton* s2 = Singleton::GetInstance();
cout << "s1的地址" << (int)s1 << endl;
cout << "s2的地址" << (int)s2 << endl;
return 0;
}
饿汉式
一开始就创建好了,以后不再改变天生是线程安全的
#include <iostream>
#include <string>
#include <mutex>
using namespace std;
class Singleton {
public:
static Singleton* GetInstance() {
return instance_;
}
private:
Singleton(){}
static Singleton* instance_;
static mutex m_mutex;
};
Singleton* Singleton::instance_ = new Singleton();
int main()
{
Singleton* s1 = Singleton::GetInstance();
Singleton* s2 = Singleton::GetInstance();
cout << "s1的地址" << (int)s1 << endl;
cout << "s2的地址" << (int)s2 << endl;
return 0;
}