设计模式
设计模式代表了最佳实践,是软件开发过程中面临一般问题的解决方案
设计模式是一套被反复使用,经过分类,代码设计的经验
单例模式
单例模式也叫单件模式Singleton是一个非常用的设计模式,建一个线程安全且高效的Singleton是非常重要的
1.不考虑线程安全的一个单例模式
class Singleton { public: static Singleton* GetInstance() { if (_sInstance == NULL) { _sInstance = new Singleton(); } return _sInstance; } static void DelInstance() { if (_sInstance) { delete _sInstance; _sInstance = NULL; } } void Print() { cout << _data << endl; } private: //定义构造函数私有,限制只能在类内创建对象 Singleton() :_data(0) {} Singleton(const Singleton&); Singleton& operator=(const Singleton&); //指向实例的指针为静态私有,这样定义静态成员函数获取对象实例 static Singleton* _sInstance; int _data; };
2.线程安全单例
懒汉模式
class Singleton { public: static Singleton* GetInstance() { if(_sInstance==NULL) { lock(); if (_sInstance == NULL) { _sInstance = new Singleton(); } unlock(); return _sInstance; } static void DelInstance() { if (_sInstance) { delete _sInstance; _sInstance = NULL; } } void Print() { cout << _data << endl; } private: //定义构造函数私有,限制只能在类内创建对象 Singleton() :_data(0) {} Singleton(const Singleton&); Singleton& operator=(const Singleton&); //指向实例的指针为静态私有,这样定义静态成员函数获取对象实例 static Singleton* _sInstance; int _data; }; //静态的数据成员必须初始化 Singleton* Singleton::_sInstance = NULL; void TestSingleton() { Singleton::GetInstance()->Print(); Singleton::DelInstance(); }
第二个版本
class Singleton { public: static Singleton* GetInstance() { if (_sInstance == NULL) { _sInstance = new Singleton(); } return _sInstance; } static void DelInstance() { std::lock_guard<std::mutex> lock(_mtx); if (_sInstance) { delete _sInstance; _sInstance = NULL; } } void Print() { cout << _data << endl; } private: //定义构造函数私有,限制只能在类内创建对象 Singleton() :_data(0) {} Singleton(const Singleton&); Singleton& operator=(const Singleton&); //指向实例的指针为静态私有,这样定义静态成员函数获取对象实例 static Singleton* _sInstance; int _data; }; //静态的数据成员必须初始化 Singleton* Singleton::_sInstance = NULL; void TestSingleton() { Singleton::GetInstance()->Print(); Singleton::DelInstance(); }
饿汉模式
方式一
class Singleton { public: // 获取唯一对象实例的接口函数 static Singleton* GetInstance() { static Singleton tmp; return &tmp; } void Print() { cout<<_data<<endl; } private: // 构造函数定义为私有,限制只能在类内创建对象 Singleton() :_data(0) {} Singleton(const Singleton&); Singleton& operator=(const Singleton&); // 单例类里面的数据 int _data; }; void TestSingleton() { Singleton::GetInstance()->Print(); }
方式二
class Singleton { public: // 获取唯一对象实例的接口函数 static Singleton* GetInstance() { assert(_sInstance); return _sInstance; } // 删除实例对象 static void DelInstance() { if (_sInstance) { delete _sInstance; _sInstance = NULL; } } void Print() { cout << _data << endl; } private: // 构造函数定义为私有,限制只能在类内创建对象 Singleton() :_data(0) {} Singleton(const Singleton&); Singleton& operator=(const Singleton&); // 指向实例的指针定义为静态私有,这样定义静态成员函数获取对象实例 static Singleton* _sInstance; // 单例类里面的数据 int _data; }; Singleton* Singleton::_sInstance = new Singleton; void TestSingleton() { Singleton::GetInstance()->Print(); Singleton::DelInstance(); }
在堆上创建对象
class AA { public: AA* GetObj() { return new AA; } private: AA() {} AA(const AA&); int a; };
在栈上创建对象
方式一
class AA { public: AA GetObj() { return AA(); } private: AA() {} AA(const AA&); int a; };
方式二
class AA { private: void*operator new(size_t); void operator delete(void*p); void*operator new[](size_t); void operator delete[](void* p); private: AA() {} AA(const AA&); int a; };
原文地址:http://10798301.blog.51cto.com/10788301/1851352