目录
在很多时候,我们整个项目工程当中,某个类的对象是有且仅有一个,生命周期是整个项目程序,如果是这种情况下,我们还去创建多个不同的类,可能会造成意想不到的bug,可能这类bug还挺隐蔽。那么在C++中如何创建有且仅有唯一的单个对象呢?其实很简单,只要做到三步即可。
一、单例模式的创建
1、将类的构造函数的访问权限设置为private私有的(防止外部进行访问);
2、设置一个静态全局的类对象instance;
3、创建一个public公有的方法GetInstance(),当需要访问这个类时,就只需要对instance进行判断是否为nullptr:
(1)当instance为nullptr,则创建类对象,并用instance做为标识;
(2)当instance不为nullptr,则返回instance本身。
二、实例代码
#include <iostream>
using namespace std;
class Singleton
{
//静态成员变量类内定义,类外初始化
static Singleton* m_instance;
//构造函数设为私有
Singleton()
{
}
//拷贝构造也为私有
Singleton(const Singleton&);
//赋值操作也设置为私有
Singleton& operator= (const Singleton&);
public:
//设置访问instance的公有方法
static Singleton* GetInstance();
void Printfln()
{
std::cout << "当前对象地址: " << this << std::endl;
}
};
//静态成员变量类内定义,类外初始化
Singleton* Singleton::m_instance = nullptr;
// 1、当instance为nullptr,则创建类对象,并用instance做为标识;
// 2、当instance不为nullptr,则返回instance本身。
Singleton* Singleton::GetInstance()
{
if (m_instance == nullptr)
{
m_instance = new Singleton();
}
return m_instance;
}
int main()
{
Singleton *singleton1 = Singleton::GetInstance();
Singleton *singleton2 = Singleton::GetInstance();
Singleton *singleton3 = Singleton::GetInstance();
singleton1->Printfln();
singleton2->Printfln();
singleton3->Printfln();
return 0;
}
三、总结
从运行结果来看,三个singleton对象都是分别指向了同一块内存,这就实现了有且仅有一个实例,而且这些singleton的生命周期是永恒的,程序运行结束也会自动释放,并不需要手动的去delete。
当然创建单例模式方法不止这一种,但是往往在项目开发中,这一种就已经够用和实用的了,单例,在我看来这是C++初学者所具备的。