1. 程式人生 > >C++經典面試題--單例模式

C++經典面試題--單例模式

轉載請註明出處

單例模式是面試到設計模式幾乎一定會問道的一個設計模式,另外的一個設計模式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


轉載請註明出處