单例模式(下)

单例模式(下)

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

  

posted on 2017-03-11 19:06  zzdoit  阅读(84)  评论(0编辑  收藏  举报

导航