单例模式
单例模式是最常见的设计模式之一,其实就是只有一个实例,并且它自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
懒汉式
一开始不创建,知道第一次调用的时候才进行创建,很懒的样子
class Singleton{
private:
Singleton(){}
static Singleton* Instance;
public:
static Singleton* GetInstance(){
if(Instance==nullptr){
Instance=new Singleton();
return Instance;
}
}
};
上述模式其实是有问题的,线程不安全。如果两个线程同时进行首次调用GetInstance的话,第一个被创建的会被第二个覆盖,并且第一个申请的空间没有释放,造成了内存泄漏,如果在多线程下的话,内存泄漏将会非常严重。
所以我们对它进行加锁,双重检测即可。加锁后只能有一个线程进行创建,保证不会被创建多次。
class Singleton{
private:
Singleton(){}
static Singleton* Instance;
public:
static Singleton* GetInstance(){
if(Instance==nullptr){
Lock();//加锁
if(Instance==nullptr){
Instance=new Singleton();
}
Unlock();//解锁
}
return Instance;
}
};
饿汉式
一开始就创建好,好像很饥饿的样子
class Singleton{
private:
Singleton(){}
~Singleton(){}
public:
static Singleton* GetInstance(){
static Singleton Instance;
return &Instance;
}
};