1. 程式人生 > >單例模式的三種實現及區別

單例模式的三種實現及區別

單例模式的三種實現方法 in Java

單例模式,是GoF23個設計模式中比較常見的一種,主要目的是讓某個類只存在一個例項。本人將列舉出3種單例模式的Java實現。

方法一 不能帶參的建構函式

本人使用的idea,在建立一個類的時候,會有一個Singleton的選項,選擇這種方式生成的類,就屬於該種寫法。這種寫法比較簡便,缺點也比較明顯

具體程式碼如下:

public class Coraline {
   private static Coraline ourInstance = new Coraline();

   public static Coraline getInstance() {
      return ourInstance;
   }

   private Coraline() {
   }
}

方法二 帶同步鎖的單例

這種寫法比較常見,主要涉及到synchronized關鍵字,具體的見下篇。需要注意synchronized關鍵字上鎖的粒度,當synchronized加在class前面時,鎖定的就是整個類;當加在類中的某個方法時,鎖定的也是整個類;這種寫法的程式碼如下:

public class Coraline {
   private static Coraline ourInstance = new Coraline();
   private static Object lock = new Object();
   public static Coraline getInstance() {
      synchronized (lock){
         if(ourInstance == null){
            ourInstance = new Coraline();
            return ourInstance;
         }
         return ourInstance;
      }
   }

   private Coraline() {
   }
}

方法三 雙檢鎖

雙檢鎖顧名思義的是指雙重檢查,這裡的雙重檢查,其實是為了更好的提高效率,因為需要加鎖的情況,僅發生在需要建立這個類的例項,所以可以減低鎖的粒度,在不用建立的情況下,不進行加鎖,更好的提高了效率,是推薦的寫法。具體程式碼如下:

public class Coraline {
   private static Coraline ourInstance = new Coraline();
   private static Object lock = new Object();
   public static Coraline getInstance() {
      if(ourInstance == null){
         synchronized (lock){
            if(ourInstance == null){
               ourInstance = new Coraline();
            }
         }
      }
      return ourInstance;
   }

   private Coraline() {
   }
}