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

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

 

おすすめ

転載: blog.csdn.net/xk641018299/article/details/116738555