1. 单例设计模式的概念
单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。
2. 单例设计模式的思路
1.即然外部不可以定义对象,也就是说是不可以从外部调到类的构造函数,所以就必须把构造函数私有 化, 但是私有化带来的问题是,在外部一个对象也定义不出来了。 所以必须在类内定义一个公开的接口,返回本类对象的指针。
2.即使用public权限下定义一函数,返回出本类对象的指针。 但是,如果这个函数是一个普通函数的话,那么他还是依赖于类对象的调用才可以,这又与只产生一 个单例相矛盾了。 所以必须,把这个函数升级为静态函数。
3.把这个函数升级为静态函数。 但是,升级为静态函数之后呢?函数就没有this指针,无法调取类中属性,所以也要把类中这个属性升 级为静态属性。
4.把类中的本类的指针,升级为静态属性。
3. 单例设计模式的分类
3.1 饿汉式
3.1.1 饿汉式的优缺点
优点:对象提前创建好,使用时无需等待,效率比较高
缺点:对象提前创建,所以占用一定的内存,内存占用大
3.1.2 饿汉式的实现
#include <iotsream>
using namespace std;
class Singleton
{
private:
static Singleton *singleton;
Singleton()
{
cout<<"这是一个无参构造"<<endl;
}
~Singleton()
{
cout<<"这是析构"<<endl;
}
public:
static Singleton* getInstance()
{
return singleton;
}
};
Singleton* Singleton::singleton = new Singleton;
int main()
{
Singleton *s1=Singleton::getinstence();
s1->show_info();
Singleton *s2=Singleton::getinstence();
s2->show_info();
Singleton *s3=Singleton::getinstence();
s3->show_info();
return 0;
}
result :
3.2 懒汉式设计模式
3.2.1 优缺点
优点:使用对象时,对象才创建,所以不会提前占用内存,内存占用小
缺点:如果两个线程同时判断singleton为空,那么它们都会去实例化一个Singleton对象,这就变成双例了。所以,我们要解决的是线程安全问题。 所以我们可以加上一个智能锁来解决这个问题lock_guard<mutex> lock(mtx);
#include <iostream>
#include <mutex>
using namespace std;
mutex mtx;
class Singleton
{
private:
static Singleton* singleton;
Singleton()
{
cout<<"这是一个无参构造"<<endl;
}
~Singleton()
{
cout<<"这是析构"<<endl;
}
public:
static Singleton* getInstance()
{
lock_guard<mutex> lock(mtx);
if (singleton == nullptr)
{
singleton = new Singleton;
}
return singleton;
}
void show_info()
{
cout<<this<<endl;
}
static void destroy()
{
if(singleton!=nullptr)
{
delete singleton;
}
}
}
Singleton* Singleton::singleton=nullptr;
int main()
{
Singleton *s1=Singleton::get_instence();
s1->show_info();
Singleton *s2=Singleton::get_instence();
s2->show_info();
Singleton *s3=Singleton::get_instence();
s3->show_info();
Singleton::destroy();
return 0;
}