C++设计模式 —— 单例模式的代码实现【C++面试热点】
单例模式是一种创建型设计模式, 保证一个类只有一个实例。共有两种代码实现方式:饿汉模式和懒汉模式。
饿汉模式(线程安全)
在单例类定义时就实例化,类中包含一个静态成员指针,并且一个公有的静态成员方法能够返回这个静态成员指针,静态成员指针指向实例化后的对象,同时将构造函数设为私有,保证只有一个对象。
#include <iostream>
using namespace std;
class SingleInstanceHungry{ // 单例模式示例代码
public:
static SingleInstanceHungry* getSingleInsPtr(){ // 公有的静态成员函数,获得静态成员指针
return singleInsPtr;
}
private:
static SingleInstanceHungry* singleInsPtr; // 静态成员指针
// 构造函数,放到私有成员中
SingleInstanceHungry(){cout << "SingleInstance 饿汉模式创建成功" << endl;}
};
// 饿汉模式,定义完成就直接实例化
SingleInstanceHungry* SingleInstanceHungry::singleInsPtr = new SingleInstanceHungry();
int main()
{
SingleInstanceHungry* s1 = SingleInstanceHungry::getSingleInsPtr();
SingleInstanceHungry* s2 = SingleInstanceHungry::getSingleInsPtr();
if (s1 == s2) cout << "单例模式测试成功!" << endl;
return 0;
}
懒汉模式(线程安全需要加锁)
尽可能晚的创建对象实例,即在第一次被调用时创建(其余与饿汉一致),多线程并行时需要加锁保证线程安全
#include <iostream>
using namespace std;
class SingleInstanceLazy{
public:
static SingleInstanceLazy* getSingleInsPtr(){
if (singleInsPtr == nullptr){
singleInsPtr = new SingleInstanceLazy();
return singleInsPtr;
}
else{
return singleInsPtr;
}
}
private:
static SingleInstanceLazy* singleInsPtr;
SingleInstanceLazy(){
cout << "SingleInstance 懒汉模式创建成功" << endl;
}
};
// 静态成员变量必须要在类外定义和初始化
SingleInstanceLazy* SingleInstanceLazy::singleInsPtr = nullptr;
int main()
{
SingleInstanceLazy* s3 = SingleInstanceLazy::getSingleInsPtr();
SingleInstanceLazy* s4 = SingleInstanceLazy::getSingleInsPtr();
if (s3 == s4) cout << "单例模式(懒汉)测试成功!" << endl;
return 0;
}