C 單例模式例項

2022-03-08 17:27:37 字數 2711 閱讀 8305

定義:在某些情況下,我們設計中的物件只需要乙個,比方說:執行緒池(threadpool)、快取(cache)、對話方塊、處理偏好設定和登錄檔物件、日誌物件、充當印表機、顯示卡等裝置的驅動程式的物件等。事實上,這類物件只能有乙個例項,如果製造出多個例項,就會導致許多問題產生。

這裡要說的單件模式就能確保乙個類只有乙個例項,並提供乙個全域性訪問點。

在c++中實現如下:

實現1:

1 #include 2

using

namespace

std;34

class

csingleton5;

1718 csingleton* csingleton::m_psingleton =null;

1920

csingleton::csingleton()

2124

25 csingleton::~csingleton()

2629

30 csingleton*csingleton::getinstance()

3136

return

m_psingleton;37}

3839

void

csingleton::cleaninstance()

4043

44int

csingleton::getvalue()

4548

49void csingleton::setvalue(int

ivalue)

5053

54int

main()

5563

else

6467

68csingleton::cleaninstance();

69return0;

70 }

相信大多數的同仁都喜歡使用上邊這種單件模式的實現方法,如果在單執行緒的情況下,是沒有問題的,但如果是多執行緒,那麼就極有可能會返回兩個不同的物件,在呼叫csingleton::getinstance的時候,兩個執行緒如果都同時執行完if判斷,而又還沒有呼叫到建構函式的話,想象下後果吧。那該怎麼辦呢?看下邊這個實現吧。

實現2:

1 #include 2

using

namespace

std;34

class

csingleton5;

1718

//在程序執行開始就例項化該單件,又稱「急切」建立例項

19 csingleton* csingleton::m_psingleton = new

csingleton();

2021

csingleton::csingleton()

2225

26 csingleton::~csingleton()

2730

31 csingleton*csingleton::getinstance()

3235

36void

csingleton::cleaninstance()

3740

41int

csingleton::getvalue()

4245

46void csingleton::setvalue(int

ivalue)

4750

51int

main()

5260

else

6164

65csingleton::cleaninstance();

66return0;

67 }

哈哈,看清楚了嗎?就是在程序執行的時候就對這個單件進行例項化,可是這樣似乎又不能達到延遲例項化的目的啦。如果我們的物件對資源占用非常大,而我們的進行在整個過程中其實並沒有用到這個單件,那豈不是白白浪費資源了嘛。還有更好的辦法。

實現3:

1 #include 2

using

namespace

std;34

class

csingleton5;

1516

csingleton::csingleton()

1720

21 csingleton::~csingleton()

2225

26 csingleton*csingleton::getinstance()

2731

32int

csingleton::getvalue()

3336

37void csingleton::setvalue(int

ivalue)

3841

42int

main()

4352

else

5356

return0;

57 }

看下執行結果吧:
process begin

constructor

two objects is the same instance

destructor

是不是跟預想的一樣呢?把單件宣告為成員函式中的靜態成員,這樣既可以達到延遲例項化的目的,又能達到執行緒安全的目的,而且看結果的最後,是不是在程式退出的時候,還自動的呼叫了析構函式呢?這樣我們就可以把資源的釋放放到析構函式裡邊,等到程式退出的時候,程序會自動釋放這些靜態成員的。

C 例項 單例模式

昨天晚上,我的老師 算是我的親戚 給了我一段 讓我看看。現copy如下 1 citysingleton.cs檔案 using system using system.data using system.configuration using system.web using system.web.s...

C 設計模式 單例例項

一.建立乙個自己型別的私有靜態變數 二.將建構函式私有化 三.建立乙個獲取例項的public靜態函式 using system using system.collections.generic using system.linq using system.text using system.thre...

C 單例模式設計例項

所謂的單例模式就是在整個程式的生命週期中,只建立乙個例項。要實現這種模式可以採用餓漢模式,飽漢模式,雙重鎖模式和懶載入模式。什麼是餓漢模式呢?餓漢模式就是很餓很著急,所以類載入時即建立例項物件。在這種情況下無需擔心多執行緒下例項被 多次建立的問題,但是如果有一些例項物件我們是不需要的那麼問題就來了,...