闲暇之余,来聊聊单例模式:

何为单例?

顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧。

首先分为2种实现:分为饿汉和懒汉模式

饿汉模式:顾名思义形容一个人很饿,所以在定义类时就实例化了对象:是一种空间换时间做法;

优点:线程安全
缺点:是一种空间换时间的做法,所以就是说会浪费空间,因为实例化的对象不被使用。
也就是将构造函数进行私有化,定义一个全区函数来获取单例对象

实现过程:

class Singleon{
private:
//构造函数
Singleon(){
cout<<"Singlenon()"<<endl;
}
static Singlenon* instance;
public:
//获取单例对象的函数
static Singleon* GetSingleon()
{
return instance;
}
static Singleon* Destroy()
{
delete instance;
instance = nullptr;
}
};
//静态对象需要在类外进行初始化
Singleon* Singleon :: instance = new Singleon(); 饿汉模式 初始化就定义对象
int main()
{
Singleon* s1=Singleon ::GetSingleon();//通过GetSingleon函数来获取单例对象。
}
 
懒汉模式:
顾名思义形容一个人很懒,在具体使用时才会实例化对象。是一种以时间换空间的做法。
class Singleon{
private:
//构造函数
Singleon(){
cout<<"Singlenon()"<<endl;
}
static Singlenon* instance;
public:
//获取单例对象的函数
static Singleon* GetSingleon()
{
return instance;
}
static Singleon* Destroy()
{
delete instance;
instance = nullptr;
}
};
//静态对象需要在类外进行初始化
Singleon* Singleon :: instance = new Singleon(); 饿汉模式 初始化就定义对象
int main()
{
Singleon* s1=Singleon ::GetSingleon();//通过GetSingleon函数来获取单例对象。
}
饿汉模式是线程安全的,而懒汉模式不是线程安全的,所以在多线程下如果想要实现线程安全,那么懒汉模式下得通过加锁机制来实现线程安全。