你的位置:首页 > ASP.net教程

[ASP.net教程]单键模式


.h文件:

#pragma once/****************************** @filename:  Singleton.h* @author:   kzf* @version:   1.0* @date:    2011/11/14 * @describe:  单键模式 保证唯一的实例如果你整个程序是单线程的,那么标准模式或Meyers单例模式是你最佳选择* @modification:无*****************************///标准模式class CSingleton1{private:  //构造函数及析构函数私有化  CSingleton1();  virtual ~CSingleton1();private:  //防止拷贝构造 以及 赋值 操作  CSingleton1(const CSingleton1 &ob);  CSingleton1& operator=(const CSingleton1 &ob);private:  static CSingleton1* m_pInstance;public:  static CSingleton1* GetInstance();  static void ReleaseInstance();  void Print();};/**标准模式的优缺点:优点:  属于“懒汉”单例模式,第一次调用GetInstance才分配内存,不调用则不分配内存缺点:  1)GetInstance中每次需要判断是否=NULL  2)由于指针动态分配,必须手动调用ReleaseInstance释放  3)多线程不安全,有可能实例化多个内存对象**///Meyers单例模式class CSingleton2{private:  //构造函数及析构函数私有化  CSingleton2();  virtual ~CSingleton2();private:  //防止拷贝构造 以及 赋值 操作  CSingleton2(const CSingleton2 &ob);  CSingleton2& operator=(const CSingleton2 &ob);private:  int m_nTestNum;public:  static CSingleton2& GetInstance();  void Print();};/**Meyers单例模式的优缺点:优点:  1)属于“懒汉”单例模式,第一次调用GetInstance才实例化  2)GetInstance中不需要判断是否=NULL,效率提高  3)使用对象不是指针分配内存,不会内存泄漏  4)多线程下能确保实例化一个内存对象缺点:  1)多线程下未真正意义上同步。  这是因为C++中构造函数并不是线程安全的。  C++中的构造函数简单来说分两步:  第一步:内存分配  第二步:初始化成员变量  结论:Meyers方式虽然能确保在多线程中产生唯一的实例,但是不能确保成员变量的值是否正确.**//**从单例模式实现的角度考虑:1、总是避免第三方调用拷贝构造函数以及赋值操作符2、总是避免第三方调用构造函数3、尽量避免第三方调用析构函数4、总是需要一个静态方法用于全局访问**/

 

.cpp文件:

#include "StdAfx.h"#include "Singleton.h"//----------------------标准模式----------------------------CSingleton1* CSingleton1::m_pInstance = NULL;CSingleton1::CSingleton1(void){  printf("Construct begin\n");  //假设各种变量的初始化操作,花费近1s时间 用Sleep进行模拟  Sleep(1000);   printf("Construct end\n");}CSingleton1::~CSingleton1(void){  printf("Destruct\n");}CSingleton1::CSingleton1(const CSingleton1 &ob){  //}CSingleton1& CSingleton1::operator =(const CSingleton1 &ob){  if (&ob != this)  {  }  return *this;}CSingleton1* CSingleton1::GetInstance(){  if (NULL == m_pInstance)  {    m_pInstance = new CSingleton1;  }  return m_pInstance;}void CSingleton1::ReleaseInstance(){  if (NULL != m_pInstance)  {    delete m_pInstance;    m_pInstance = NULL;  }}void CSingleton1::Print(){  printf("print out CSingleton1\n");}//----------------------Meyers单例模式----------------------------CSingleton2::CSingleton2(void){  m_nTestNum = 0;  printf("Construct begin,testnum=%d\n", m_nTestNum);  //假设各种变量的初始化操作,花费近1s时间 用Sleep进行模拟  Sleep(1000);   m_nTestNum = 100;  printf("Construct end,testnum=%d\n", m_nTestNum);}CSingleton2::~CSingleton2(void){  printf("Destruct\n");}CSingleton2::CSingleton2(const CSingleton2 &ob){  //}CSingleton2& CSingleton2::operator =(const CSingleton2 &ob){  if (&ob != this)  {  }  return *this;}CSingleton2& CSingleton2::GetInstance(){  //使用局部静态变量方式,从而使之延迟到调用时实例化  static CSingleton2 gInstance;  return gInstance;}void CSingleton2::Print(){  printf("print out CSingleton2 testnum=%d\n", m_nTestNum);}