单例模式(下)
单例模式(下)
- 分析单例模式上,其存在几点设计上的问题
- 使用单例模式时:
- 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; }