JavaRush /Java Blog /Random-TW /用自己的話來說單例模式
Roman_kh
等級 33
Харьков

用自己的話來說單例模式

在 Random-TW 群組發布

大家好,javaRush!

今天跟大家講一下設計模式Singleton(單)。 用自己的話來說單例模式 - 1目標:建立一個只有一個物件的類別。這意味著無論訪問多少次,都會傳回第一次建立的同一個物件。這是一件很方便的事情,在很多地方都是必要的,它被實現到框架中並不是沒有原因的。 應用:
  • 例如,您需要將資料庫連接到專案以及負責連接到該專案的類別。連接創建一次,無需多次創建
  • Application settings— 負責應用程式所需的連線設定的類別:資料庫主機和連接埠等。它們創建一次並在應用程式的整個操作過程中使用。
  • 還有很多我沒有提到的例子,所以請在評論中寫下你的選擇!=)
在這個介紹之後,據我了解,我們可以展示這個類別的一個例子:(儘管我相信我們每個人都可以想出這個類別的實現)這是最簡單的例子,當我們將構造函數設為私有時,即 您無法明確建立物件。並且有一個getInstance()提供物件的靜態方法。
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
多執行緒有問題,那麼可以放一個getInstance()標記方法synchronized
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static synchronized Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
最後,像往常一樣,我想說,如果你有不同的想法或發現我的錯誤,請寫在評論中!我們將愉快地討論一切:)如果您喜歡這篇文章,請寫“+”,我會知道的。這對我來說很重要:) PS 我正在添加更多實現:根據Joshua Bloch 的說法,這是實現模板的最佳方式Enum Singleton
public enum Singleton {
   INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
        private static volatile Singleton instance;

        public static Singleton getInstance() {
      Singleton localInstance = instance;
      if (localInstance == null) {
         synchronized (Singleton.class) {
            localInstance = instance;
            if (localInstance == null) {
               instance = localInstance = new Singleton();
            }
         }
      }
      return localInstance;
   }
}
並進一步On Demand Holder idiom
public class Singleton {

   public static class SingletonHolder {
      public static final Singleton HOLDER_INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
      return SingletonHolder.HOLDER_INSTANCE;
   }
}
+延遲初始化 +高效 -能不能用於非靜態類別欄位 任何問題/建議 - 寫在評論中! 另請參閱我的其他文章:
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION