原文鏈接:http://www.hubwiz.com/class/572afcc708ce8b3d3a143619
單例
我們都知道面向對象程序設計中,最讓人著迷和驚嘆的就是設計模式了,在學習Java中最常用的就是單例模式了。那么什么是單例模式呢?所謂單例模式就是我們一個對象只能有一個實例。這么說不是很確切的話還可以這么說,我們經常在windows下可以看到一個應用只能打開一個,再次打開的時候不會產生新的進程。或者大家都喜歡玩游戲,很多游戲都不能雙開的,這其中的原理就是單例模式。
用了這么多語言解決單例模式,那么怎么樣實現單例模式呢?下面是一個簡單的例子。
publicclassMain{
privateMain(){}
staticMaininstance=newMain();
staticMaingetInstance(){
returninstance;
}
}
我們來分析一下這個單例模式,先建立了一個私有的默認構造方法,這就保證了在這個類的外部是無法new出這個類的實例的,之后我們在這個類中new出這個類的實例,用一個靜態方法去返回這個例子。這樣我們只有調用getInstance這個方法的時候,才能new出實例。那么這個單例是否有缺陷呢?當然是有的,我們使用了靜態的變量區new,這就導致了在類加載的時候實例已經被new了,只是我們不能獲得而已。那么我們接下來就改進一下這個單例模式。
publicclassMain{
privateMain(){}
staticclassT{
staticMaininstance=newMain();
}
staticMaingetInstance(){
returnT.instance;
}
}
這個是改進好的代碼,這個單例模式中,我們使用了一個靜態內部類,但是不會再類加載的時候加載,只是在調用內部類的時候加載,也就是說,這個方式可以延遲類的加載,有的時候回帶來一定的好處,不過就是比較麻煩,在對空間沒有太大要求的時候,就可以不用這種方式。
具體實例如下:
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();
}
}
最后出現的結果就是在控制臺只會輸出一個hello,這就是唯一的一個實例。