原文鏈接:http://www.hubwiz.com/class/572afcc708ce8b3d3a143619
單例
我們都知道面向?qū)ο蟪绦蛟O(shè)計中,最讓人著迷和驚嘆的就是設(shè)計模式了,在學習Java中最常用的就是單例模式了。那么什么是單例模式呢?所謂單例模式就是我們一個對象只能有一個實例芹敌。這么說不是很確切的話還可以這么說,我們經(jīng)常在windows下可以看到一個應用只能打開一個,再次打開的時候不會產(chǎn)生新的進程狂塘。或者大家都喜歡玩游戲鳄厌,很多游戲都不能雙開的荞胡,這其中的原理就是單例模式。
用了這么多語言解決單例模式了嚎,那么怎么樣實現(xiàn)單例模式呢泪漂?下面是一個簡單的例子廊营。
publicclassMain{
privateMain(){}
staticMaininstance=newMain();
staticMaingetInstance(){
returninstance;
}
}
我們來分析一下這個單例模式,先建立了一個私有的默認構(gòu)造方法萝勤,這就保證了在這個類的外部是無法new出這個類的實例的露筒,之后我們在這個類中new出這個類的實例,用一個靜態(tài)方法去返回這個例子敌卓。這樣我們只有調(diào)用getInstance這個方法的時候慎式,才能new出實例。那么這個單例是否有缺陷呢趟径?當然是有的瘪吏,我們使用了靜態(tài)的變量區(qū)new,這就導致了在類加載的時候?qū)嵗呀?jīng)被new了蜗巧,只是我們不能獲得而已掌眠。那么我們接下來就改進一下這個單例模式。
publicclassMain{
privateMain(){}
staticclassT{
staticMaininstance=newMain();
}
staticMaingetInstance(){
returnT.instance;
}
}
這個是改進好的代碼幕屹,這個單例模式中蓝丙,我們使用了一個靜態(tài)內(nèi)部類,但是不會再類加載的時候加載望拖,只是在調(diào)用內(nèi)部類的時候加載渺尘,也就是說,這個方式可以延遲類的加載说敏,有的時候回帶來一定的好處沧烈,不過就是比較麻煩,在對空間沒有太大要求的時候像云,就可以不用這種方式锌雀。
具體實例如下:
classA {
privatestaticvolatileAinstance;
privatestaticReentrantLocklock=newReentrantLock();
privateA() {
System.out.println("Hello");
}
publicstaticSingleton getInstance() {
if(instance==null) {
synchronized(A.class) {
if(instance==null) {
instance=newA();
}
}
}
returnnull;
}
}
singleton:
publicclassSingletonextendsThread {
publicvoidrun() {
super.run();
System.out.println("MyThread");
A.getInstance();
}
publicstaticvoidmain(String[]args) {
Singletons1=newSingleton();
Singletons2=newSingleton();
Singletons3=newSingleton();
s1.start();
s2.start();
s3.start();
}
}
最后出現(xiàn)的結(jié)果就是在控制臺只會輸出一個hello,這就是唯一的一個實例迅诬。