单例模式(下)
单例模式(下)
- 分析单例模式上,其存在几点设计上的问题
- 使用单例模式时:
- 1 必须定义静态变量c_instance
- 2 必须定义静态成员函数GetInstance()
- 回到现实生活中:超市收银端不仅仅扫描枪是单例,收银箱也可以是单例
- 那么再来一个单例类?那就是重复造轮子了.@####思考: 能不能把单例上中的类抽象出来,做成一个模板型的单例呢?@####答案是肯定可以的.
- 代码实现中要注意什么呢?
- 构造和析构函数都不管,只管两个静态的,一个静态的成员,一个静态的成员方法
- 注意模板实现中的书写规范
- 逻辑相同,注意模板中类的替换
- 调用此单例模板时,要注意方式####可以用友元: friend class Singleton<Sobject>;
- 完成代码:
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
template <typename T>
class Singleton
{
static T* instance_;
public:
static T* GetInstance();
};
template <typename T>
T* Singleton<T>::instance_ = nullptr;
template <typename T>
T* Singleton<T>::GetInstance()
{
if(instance_ == nullptr)
instance_ = new T;
return instance_;
}
#endif // ! _SINGLETON_H_
#include <iostream>
#include <string>
#include "Singleton.h"
//#include "Singleton0.h"
using namespace std;
class SObject
{
friend class Singleton<SObject>;
SObject(){}
SObject(const SObject&);
SObject operator=(const SObject&);
public:
void Print()
{
cout << "this = " << this << endl;
}
};
int main()
{
SObject* s = Singleton<SObject>::GetInstance();
SObject* s1 = Singleton<SObject>::GetInstance();
SObject* s2 = Singleton<SObject>::GetInstance();
SObject* s3 = Singleton<SObject>::GetInstance();
s->Print();
s1->Print();
s2->Print();
s3->Print();
return 0;
}
浙公网安备 33010602011771号