标签:class 模板方法 template 单例 就是 解决 很多 对象指针 类的设计
本次博文假设有一个Manager管理类,并以此为探究单例类的设计模式。
类声明:
class Manager{ public: ~Manager(); //提供单例对象访问 static Manager* getInstance(); //删除单例对象 void deleteInstance(); void dosometing(); private: //构造函数声明为 保护方法 Manager(); //单例对象指针 static Manager* s_Manager; };
类方法定义:
//单例对象指针初始化为nullptr,防止指向了未定义的数据 Manager* Manager::s_Manager = nullptr; //提供单例类对象访问 static Manager* Manager::getInstance(){ if(!s_Manager)s_Manager = new CacheManger(); return s_Manager; } //删除单例类 void Manager::deleteInstance(){ if(s_Manager){ deleted s_Manager; s_Manager = nullptr;}//别忘了赋予空指针,否则指向未定义的数据 } void Manager::dosometing(){ //dosometing }
这样我们就能在平时的程序用
Manager::getInstance()->dosomething();
来运用单例类来做某些操作了。
在实际项目中,我发现有大量的工厂管理等需要单例化的类,如果每个类都要写getInstance(),deleteInstance()方法未免太过麻烦。
基于这个缺点(偷懒点),自然而然想到用模板。
(因为大部分单例类都是共有getInstance(),deletedInstance(),而模板可以重载这些共有的类函数,于是思路如下)
模板:
template<class T> class Singleton{ private: static T * s_instance; public: static T * getInstance(); static void deleteInstance(); }; //模板类提供单例类访问方 template<class T> T * Singleton<T>::getInstance() { if (!s_instance)s_instance = new T(); return s_instance; } //模板类删除单例类 template<class T> void Singleton<T>::deleteInstance() { if (s_instance) {delete s_instance; s_instance = nullptr; } } //模板类静态变量初始化 template<class T> T* Singleton<T>::s_instance = nullptr;
类声明:
class Manager : public Singleton<Manager>{ public: ~Manager(); void dosomething(); //由于Singleton<CacheManger>无法访问CacheManger的private方法(就是那个构造函数),只能借助友元提供权限. friend Singleton<CacheManger>; private: //构造函数声明为 私有方法 Manager(); };
类定义:
void Manager::dosomething(){ //dosometing }
使用方法:
CacheManger::getInstance()->dosomething();
相比第一个的一般做法,
Manager把单例方法转移到在Singleton的实现里,从而
使Manager的类声明和定义清爽了很多,简洁了一些。
这在需要多个单例类的项目中能让程序员避免了多余冗杂的代码,提高码字效率(偷懒)。
(警告:本文并未考虑线程安全)
综合起来,依个人愚见,在某个项目中需要大量单例类时,采取第二种即单例模板方法较为妥当。
而平时用用第一种单例类方法也没什么坏处。
标签:class 模板方法 template 单例 就是 解决 很多 对象指针 类的设计
原文地址:https://www.cnblogs.com/KillerAery/p/9097529.html