您的位置:首页 > 编程语言 > C语言/C++

C++经典面试题--单例模式

2014-10-03 18:03 337 查看
转载请注明出处

单例模式是面试到设计模式几乎一定会问道的一个设计模式,另外的一个设计模式MVC也是很常见,后续博文会继续分析MVC模式

就是一个类只返回一个对象的实体。

对象只是在第一次初始化的时候执行构造函数,进行创建。

比如:一家公司只会有一个CEO实体,任何事情都得回报给这个CEO,如果两个CEO会出现公司的管理混乱。

本文列出较较为完善的写法:

这样写考虑到了

1、多线程的线程安全:用临界区保护

2、异常安全

3、用两次if(m_sigleton == NULL)判断,第一次判断保证只有第一次需要进入临界区,以后都不需要。第二次保证,即使再第一次初始化的时候多个线程同时依次进入临界区。保证程序的高效性

#include "stdafx.h"
#include <Windows.h>
#include <iostream>

using namespace std;

class HwcHelpClass  
{  
private:         
  CRITICAL_SECTION m_cs;  
public:  
HwcHelpClass()
{  
  InitializeCriticalSection(&m_cs);
}
void lock()
{
  EnterCriticalSection(&m_cs);
}
void unlock()
{
  LeaveCriticalSection(&m_cs);
}
~HwcHelpClass()  
{  
  DeleteCriticalSection(&m_cs);
}  
};  

class HwcSignleton
{
private:
HwcSignleton();
int m_test;

public:
static HwcSignleton * m_singleton;
static HwcHelpClass *hc;
static HwcSignleton * GetInstance();
void test();
~HwcSignleton();
};
void HwcSignleton::test()
{
  ++m_test;
  cout<<m_test<<endl;
}
HwcSignleton::HwcSignleton()
{
  m_test = 5;
}
HwcSignleton * HwcSignleton::m_singleton = 0;
HwcHelpClass * HwcSignleton::hc = 0;
HwcSignleton * HwcSignleton::GetInstance()
{
  if (m_singleton == NULL)
  {
    hc = new HwcHelpClass();
    hc->lock();
    if (m_singleton == NULL)
    {
      m_singleton = new HwcSignleton();
    }
    hc->unlock();
  }
  return m_singleton;
}

int _tmain(int argc, _TCHAR* argv[])
{
  HwcSignleton * exp1 = HwcSignleton::GetInstance();
  exp1->test();
  HwcSignleton* exp2 = HwcSignleton::GetInstance();
  exp2->test();
}


测试后结果

第一次初始化,m_test 为5,print的时候+1,所以为6,第二次返回同一个对象,所以+1后输出7



转载请注明出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: