Java 單例模式

原文鏈接: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,這就是唯一的一個實例。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. 實現單例模式 餓漢模式和懶漢模式單例模式根據實例化時機分為餓漢模式和懶漢模式。餓漢模式,是指不等到單例真正使...
    aaron1993閱讀 228評論 0 0
  • 定義 一個類只有一個實例,自行實例化并提供給整個系統。 基本思路 將該類構造函數私有化,并通過靜態方法獲取一個唯一...
    劇透下閱讀 251評論 0 0
  • 單例模式簡介 在GoF的23種設計模式中,單例模式是比較簡單的一種。然而,有時候越是簡單的東西越容易出現問題。下面...
    王帥199207閱讀 1,509評論 0 107
  • 1.爺爺 今年80歲,16歲開始抽煙,抽旱煙和香煙。 煙葉是自家種的,煙葉長成了,采摘下來,幾個葉子一捆,晾曬煙葉...
    阿爾法小丸子閱讀 303評論 0 0
  • 001 項目與日常運營的不同 項目有明確的的起點與終點,一旦實現目標,隨即終止,有獨特的產品、服務或成果;而日常運...
    李小川_新晉奶爸閱讀 369評論 2 2