一种优雅的单例写法(三个特点)

该方法从订阅器(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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xktesla

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值