C++之单例模式 (Singleton)

· 一个类仅有一个实例,通过全局访问点获取之

· 将包括拷贝构造函数在内的所有构造函数私有化,防止类的使用者从类的外部创建对象

· 公有静态成员函数getInstance()是获取对象实例的唯一渠道

· 饿汉式:无论用不用,程序启动即创建

· 懒汉式:用的时候创建,不用了即销毁

永不销毁

引用计数

线程安全

饿汉式代码示例:

#include <iostream>
using namespace std;

class Config
{
private:
    Config(){}
    Config(const Config& that){}
private:
    static Config s_instance;
public:
    static Config& getInstance()
    {
        return s_instance;
    }
};

Config Config::s_instance;

int main()
{
    Config& s = Config::getInstance(); //唯一获取对象的途径
    return 0;
}

懒汉式代码示例:

#include <iostream>
using namespace std;

class Config
{
private:
    Config(){}
    Config(const Config& that){}
    ~Config()
    {
        s_instance = NULL;
    }
private:
    static Config* s_instance;
    static size_t s_counter;
    static pthread_mutex_t s_mutex;
public:
    static Config& getInstance()
    {
        if(!s_instance)    //先判断一下,会提高读写锁的性能
        {
            pthread_mutex_lock(&s_mutex);
            if(!s_instance)
                s_instance = new Config; //静态函数可以调用非静态成员
            pthread_mutex_unlock(&s_mutex);
        }
        ++s_counter;
        return *s_instance;
    }
    void releaseInstance()
    {
        if(s_counter && --s_counter == 0)
            delete this;
    }
};
//静态成员初始化
Config* Config::s_instance =  NULL;
size_t Config::s_counter = 0;
pthread_mutex_t Config::s_mutex = PTHREAD_MUTEX_INITIALIZER;

int main()
{
    Config& s = Config::getInstance(); //唯一获取对象的途径
    s.releaseInstance();
    return 0;
}
原文地址:https://www.cnblogs.com/SamRichard/p/3490480.html