定義:在某些情況下,我們設計中的物件只需要乙個,比方說:執行緒池(threadpool)、快取(cache)、對話方塊、處理偏好設定和登錄檔物件、日誌物件、充當印表機、顯示卡等裝置的驅動程式的物件等。事實上,這類物件只能有乙個例項,如果製造出多個例項,就會導致許多問題產生。
這裡要說的單件模式就能確保乙個類只有乙個例項,並提供乙個全域性訪問點。
在c++中實現如下:
實現1:
1 #include 2using
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 2using
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 2using
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 單例模式設計例項
所謂的單例模式就是在整個程式的生命週期中,只建立乙個例項。要實現這種模式可以採用餓漢模式,飽漢模式,雙重鎖模式和懶載入模式。什麼是餓漢模式呢?餓漢模式就是很餓很著急,所以類載入時即建立例項物件。在這種情況下無需擔心多執行緒下例項被 多次建立的問題,但是如果有一些例項物件我們是不需要的那麼問題就來了,...