码迷,mamicode.com
首页 > 编程语言 > 详细

C++单例类设计模式的思考

时间:2018-05-27 22:09:11      阅读:234      评论:0      收藏:0      [点我收藏+]

标签: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的类声明和定义清爽了很多,简洁了一些。
这在需要多个单例类的项目中能让程序员避免了多余冗杂的代码,提高码字效率(偷懒)。

(警告:本文并未考虑线程安全)

综合起来,依个人愚见,在某个项目中需要大量单例类时,采取第二种即单例模板方法较为妥当。
而平时用用第一种单例类方法也没什么坏处。

C++单例类设计模式的思考

标签:class   模板方法   template   单例   就是   解决   很多   对象指针   类的设计   

原文地址:https://www.cnblogs.com/KillerAery/p/9097529.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!