單例模式定義:保證一個類僅有一個實例她我,并提供一個訪問它的全局訪問點。
所有類都有構(gòu)造方法谷誓,不編碼則系統(tǒng)默認(rèn)生成空的構(gòu)造方法绒障,若有顯示定義的構(gòu)造方法,默認(rèn)的構(gòu)造方法就會失效捍歪。
通常我們可以讓一個全局變量使得一個對象被訪問户辱,但它不能防止你實例化多個對象,一個最好的辦法就是糙臼,讓類自身負(fù)責(zé)保存它的唯一實例庐镐,這個類可以保證,沒有其他實例可以被創(chuàng)建变逃,并且它可以提供一個訪問該實例的方法必逆。
單例模式因為Singleton類封裝它的唯一實例,這樣它可以嚴(yán)格地控制客戶怎樣訪問它以及何時訪問它韧献。簡單地說就是對唯一實例的受控訪問末患。
單例模式(Singleton)結(jié)構(gòu)圖
Singleton類,定義一個GetInstance操作锤窑,允許客戶訪問它的唯一實例璧针,GetInstance是一個靜態(tài)方法,主要負(fù)責(zé)創(chuàng)建自己的唯一實例渊啰。
1.懶漢模式(線程不安全)
申明了一個靜態(tài)對象探橱,在用戶第一次調(diào)用時初始化;
雖然節(jié)約了資源绘证,但是第一次加載時需要實例化隧膏,反應(yīng)稍慢,而且多線程時不能正常工作嚷那;
2.懶漢模式(線程安全)
lock:確保當(dāng)一個線程位于代碼的臨界區(qū)時胞枕,另一個線程不進入臨界區(qū)。
可以在多線程中工作魏宽,但是每次調(diào)用GetInstance方法時都需要進行同步腐泻,造成不必要的同步開銷,而且大部分時候我們是用不到同步的队询,所以不建議用這種模式派桩。
3.雙重鎖定
這種方式采用雙鎖機制,安全且在多線程情況下能保持高性能蚌斩。
4.靜態(tài)初始化
C#與公共語言運行庫也提供了一種“靜態(tài)初始化”方法铆惑,這種方法不需要開發(fā)人員顯示地編寫線程安全代碼,即可解決多線程環(huán)境下它是不安全的問題。
這種靜態(tài)初始化的方式是在自己被加載時就將自己實例化员魏,所以被形象地稱之為餓漢式單例類丑蛤。