zoukankan      html  css  js  c++  java
  • C++单例模式案例

    单例模式要注意两点:

    1. 通过一个Instance方法,得到类型唯一的实例
    2. 屏蔽掉外部创建类型实例的方法

    有两种实现思路:

    1. 在Instance函数内部使用static声明变量,使其具有唯一实例
    2. 在cpp文件中定义全局static指针,并在Instance函数初始化一次

    对于屏蔽外部的实现,只需将构造函数和析构函数声明成私有的即可(友元什么的特殊情况就不考虑了)。

    思路1的代码比较简单,如下:

    // somemgr.hpp
    class SomeMgr {
    public:
        static SomeMgr& Instance();
    
        int GetSomeValue() const { return some_value_; }
    private:
        SomeMgr() : some_value_(42) {}
        ~SomeMgr() { std::cout << "~SomeMgr()\n"; }
    
        int some_value_;
    };
    
    // somemgr.cpp
    #include "somemgr.hpp"
    SomeMgr& SomeMgr::Instance()
    {
        static SomeMgr inst;
        return inst;
    }
    

    思路2略为复杂,但由于是用指针维护单例,所以更加灵活,比如可以提供一个ReInit方法,来重新创建一个新的单例。

    // somemgr.hpp
    class SomeMgr {
    public:
        static SomeMgr* Instance();
        bool ReInit();      // 重新创建单例对象, 并执行 Init
        
         // user implements below
        bool Init();
        int GetSomeValue() const { return some_value_; }
    
    private:
        SomeMgr() : some_value_(0) {}
        ~SomeMgr() {}
    
        int some_value_;
    };
    
    #include "somemgr.hpp"
    
    static SomeMgr *some_mgr = nullptr;
    
    SomeMgr* SomeMgr::Instance()
    {
        if (!some_mgr) {
            some_mgr = new SomeMgr();
        }
    
        return some_mgr;
    }
    
    bool SomeMgr::ReInit()
    {
        SomeMgr *temp = new SomeMgr();
        if (!temp->Init()) {
            delete temp;
            return false;
        }
    
        if (some_mgr)
            delete some_mgr;
    
        some_mgr = temp;
        return true;
    }
    
    bool SomeMgr::Init()
    {
        some_value_ = 100;
        return true;
    }
    
  • 相关阅读:
    python 学习笔记 数值型(1)
    python 学习笔记 标识符和变量(3)
    python 学习笔记 字符串(2)
    jsp+servlet+javaBean+Dao
    面试被问到岗时间,是越快越好吗?
    有赞多平台推广接入与测试
    HTTPS 加密、证书、签名与握手
    开发到底要不要自己做测试?
    我也曾找不到工作
    世界第三大浏览器正在消亡
  • 原文地址:https://www.cnblogs.com/demon90s/p/15618712.html
Copyright © 2011-2022 走看看