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; }
posted on 2013-12-25 13:30 Sam.Richard 阅读(487) 评论(0) 编辑 收藏 举报