1 单例模式
1.0 需求
类的对象只能存在一个。
1.1 实现
使用类的静态对象成员保存唯一的单例对象,然后将构造函数设为private。
通过一个静态函数返回保存的单例对象。
依据静态数据成员创建的时机分为:程序加载时创建(直接new),首次需要的时候创建(get中先判断是否为null)
在多线程中,延时创建会导致争用,因此采用两段判断的形式。
class Singleton { private: Singleton() = default; static Singleton *_instance; public: static Singleton *instance(); static bool freeInstance(); Mutex lock; }; //惰性模式,不访问不创建,在第一次访问的时候创建 //对静态变量的初始化必需放在类的外部 Singleton Singleton::*_instance = nullptr; Singleton Singleton::*instance() { // 两段判断的形式 if (_instance = nullptr) { MutexLock lock(lock); if (_instance = nullptr) { _instance = new Singleton(); } } return _instance; } //非惰性模式 //在程序一运行就进行了初始化 Singleton Singleton::*_instance = new Singleton(); Singleton Singleton::*instance() { return _instance; } bool Singleton::freeInstance() { if (_instance != nullptr) { delete _instance; _instance = nullptr; } }
单例模式的派生类也是单例模式
// 每个派生体系都公用一个基类实例。 template <class T> class Singleton { private: static T *m_Instance; protected: Singleton(){}; Singleton(const Singleton &); public: static T *Get_Instance() { if(m_Instance == nullptr) { m_Instance =new T; //这里生成的是T } return m_Instance; } static void Free_Instance(); }; // public 继承的原因在于,派生类需要使用 Get_Instance 和 Free_Instance; class test : public Singleton<test> { // 声明为 友元原因在于需要调用 Singleton 中的 Get_Instance 需要 new T ,需要 // 调用本类 的构造函数。 friend class Singleton<test>; private: test() {} public: //do };