单例模式

//饿汉模式:即类产生的时候就创建好实例对象,这是一种空间换时间的方式
class CSingleton
{
public:
    ~CSingleton() {};
    CSingleton(const CSingleton&);
    CSingleton& operator=(const CSingleton&);
    static CSingleton& GetInstance()
    {        
        return instance;
    }
private:
    CSingleton() {};
    static CSingleton instance;
};

//懒汉模式:即在需要的时候,才创建对象,这是一种时间换空间的方式
class CSingleton
{
public:
    ~CSingleton(){};
    CSingleton(const CSingleton&);
    CSingleton& operator=(const CSingleton&);
    static CSingleton& GetInstance()
    {
        static CSingleton instance;
        return instance;
    }
private:
    CSingleton(){};

};

//双层锁的方式
class CSingleton
{
public:
    ~CSingleton() {};
    static CSingleton* GetInstance()
    {
        if (m_pInstance == nullptr)
        {
            std::lock_guard<std::mutex> lck(m_mutex);
            if (m_pInstance == nullptr)
            {
                m_pInstance = new CSingleton;   //内存存在泄漏,可替换智能指针方式
            }
            return m_pInstance;
        }
    }
private:
    CSingleton() {};
    static CSingleton* m_pInstance;
    static std::mutex m_mutex;
};

//智能指针方式
class CSingleton
{
public:
    ~CSingleton() {};    //注意智能指针shared_ptr无法访问私有化的析构函数,若析构函数定义为private,则在单例类内部再定义一个静态的Destory函数,在定义share_ptr的时候指定删除器为destroy
    static std::shared_ptr<CSingleton> GetInstance()
    {
        if (m_pInstance == nullptr)
        {
            std::lock_guard<std::mutex> lck(m_mutex);
            if (m_pInstance == nullptr)
            {
                m_pInstance = std::shared_ptr<CSingleton>(new CSingleton);
            }
            return m_pInstance;
        }
    }
private:
    CSingleton() {};
    static std::shared_ptr<CSingleton> m_pInstance;
    static std::mutex m_mutex;
};

 

posted on 2021-01-21 11:45  Noora&w  阅读(53)  评论(0编辑  收藏  举报