1. 程式人生 > >java基礎-單例模式

java基礎-單例模式

java中的定義:

單例模式( Singleton模式),一個類有且僅有一個例項,並且自行例項化向整個系統提供(公開)。

單例模式的三個要點

具體實現的角度來說:

  1. 構造方法私有化
  2. 靜態屬性指向例項
  3. public staticgetInstance方法,返回第二部的靜態屬性

餓漢單例模式

餓漢模式,無論如何都會建立一個例項

/*
*例子取自http://how2j.cn
*以lol中的大龍(GiantDragon)為例。
*大龍只有一隻,所以該類,只能被例項化一次。
*/
package charactor;
public class GiantDragon
{ //私有化構造方法使得該類無法在外部通過new 進行例項化 private GiantDragon(){ } //準備一個類屬性,指向一個例項化物件。 因為是類屬性,所以只有一個 private static GiantDragon instance = new GiantDragon(); //public static 方法,提供給呼叫者獲取物件 public static GiantDragon getInstance(){ return instance; } }

懶漢單例模式

懶漢式單例模式與餓漢式單例模式不同,只有在呼叫getInstance()的時候,才會建立例項。

package charactor;
public class GiantDragon {
    //私有化構造方法使得該類無法在外部通過new 進行例項化
    private GiantDragon(){        
    }
    //準備一個類屬性,用於指向一個例項化物件,但是暫時指向null
    private static GiantDragon instance;
    //public static 方法,返回例項物件
    public static GiantDragon getInstance(){
    	//第一次訪問的時候,發現instance沒有指向任何物件,這時例項化一個物件
if(null==instance){ instance = new GiantDragon(); } //返回 instance指向的物件 return instance; } }

補充:還有一種雙重鎖模形式。

什麼時候使用餓漢式,什麼時候使用懶漢式?

餓漢式,是立即載入的方式,無論是否會用到這個物件,都會載入。
如果在構造方法裡寫了效能消耗較大,佔時較久的程式碼,比如建立與資料庫的連線,那麼就會在啟動的時候感覺稍微有些卡頓。

懶漢式,是延遲載入的方式,只有使用的時候才會載入。 並且有執行緒安全的考量。
使用懶漢式,在啟動的時候,會感覺到比餓漢式略快,因為並沒有做物件的例項化。 但是在第一次呼叫的時候,會進行例項化操作,感覺上就略慢。