该方法从订阅器(Mailer)中抽提出来,详情查看 https://blog.csdn.net/xk641018299/article/details/111461454
// 特点:
// 1. 可免去创建一个cpp文件:假如单例类比较简单,只需要一个.h文件,通过设计一个_get_static_ptr_()可以免去专门为初始化一个静态成员变量(如s_pInstance)而创建一个cpp文件。
// 2. 可在需要的时候对单例对象进行释放:可通过UnInitialize()在必要的场景下对单例对象进行释放。
// 3. 保证了调用方法一致性;通过设计Initialize(Argument arg)和UnInitialize(),保证了在程序任何时候获取单例时都以同样的形式GetInstance(无参)来获取。
class Mailer
{
public:
static Mailer* GetInstance()
{
return *_get_static_ptr_();
}
static Mailer* Initialize(Argument arg)
{
if (*_get_static_ptr_() == nullptr)
{
*_get_static_ptr_() = new Mailer(arg);
}
return *_get_static_ptr_();
}
static void UnInitialize()
{
if (*_get_static_ptr_() != nullptr)
{
delete *_get_static_ptr_();
*_get_static_ptr_() = nullptr;
}
}
private:
Mailer(Argument arg) { }
virtual ~Mailer() { }
static Mailer** _get_static_ptr_() { static Mailer* pInstance = nullptr; return &pInstance; }
};
// 使用方法
int main()
{
Application app;
Mailer::Initialize(); // 初始化
app.Run(); // 程序运行期间,通过Mailer::GetInstance()获取Mailer实例
Mailer::UnInitialize(); // 反初始化
return 0;
}