Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階Java

Java 雜項

Java APIs與框架

Java 類引用

Java 有用資源

Java - 單例類



Java單例設計模式

單例模式是Java中最簡單的設計模式之一。這種設計模式屬於建立模式,因為它提供了一種建立物件的最佳方法。

Java單例類

這種模式涉及一個單一的類,它負責建立物件,同時確保只建立單個物件。這個類提供了一種訪問其唯一物件的方法,可以直接訪問而無需例項化類的物件。

由於只有一個單例例項,單例的任何例項欄位都只會在每個類中出現一次,就像靜態欄位一樣。單例通常控制對資源的訪問,例如資料庫連線或套接字。

例如,如果您只有一個數據庫連線許可證,或者您的JDBC驅動程式在多執行緒方面存在問題,則單例確保只建立一個連線,或者只有一個執行緒可以同時訪問連線。

單例設計模式的優點

單例設計模式節省記憶體,因為它只建立了一個物件例項,並且它還提供對其例項的全域性訪問。

單例設計模式的用途

當您想要建立一個只有一個例項的類時,使用單例設計模式。它主要用於多執行緒中,以建立多執行緒和資料庫相關的應用程式。

一些使用單例設計模式的設計

  • 建立日誌記錄類
  • 建立與配置管理相關的類
  • 建立與資料庫連線池相關的類
  • 為快取機制建立一個類

Java單例類/設計模式:示例

示例1

最簡單的實現包括一個私有建構函式和一個用於儲存其結果的欄位,以及一個具有諸如getInstance()之類的名稱的靜態訪問器方法。

私有欄位可以在靜態初始化塊中賦值,或者更簡單地使用初始化器賦值。getInstance()方法(必須是公共的)然後簡單地返回此例項 -

package com.tutorialspoint;

class Singleton {

   private static Singleton singleton = new Singleton( );

   /* A private Constructor prevents any other
    * class from instantiating.
    */
   private Singleton() { }

   /* Static 'instance' method */
   public static Singleton getInstance( ) {
      return singleton;
   }

   /* Other methods protected by singleton-ness */
   protected void demoMethod( ) {
      System.out.println("demoMethod for singleton");
   }
}
public class Tester {

   public static void main(String[] args) {
      Singleton tmp = Singleton.getInstance( );
      tmp.demoMethod( );
   }
}

如果您編譯並執行上述程式,您將得到以下結果 -

輸出

demoMethod for singleton

示例2

下面的實現顯示了一個經典的單例設計模式。在這個例子中,ClassicSingleton類維護對唯一單例例項的靜態引用,並從靜態getInstance()方法返回該引用。

在這裡,ClassicSingleton類採用了一種稱為延遲例項化的技術來建立單例;因此,只有在第一次呼叫getInstance()方法時才會建立單例例項。這種技術確保僅在需要時才建立單例例項。

package com.tutorialspoint;

class ClassicSingleton {

   private static ClassicSingleton instance = null;
   private ClassicSingleton() {
      // Exists only to defeat instantiation.
   }

   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
   
   protected void demoMethod( ) {
      System.out.println("demoMethod for singleton");
   }
}
public class Tester {

   public static void main(String[] args) {
      ClassicSingleton tmp = ClassicSingleton.getInstance( );
      tmp.demoMethod( );
   }
}

如果您編譯並執行上述程式,您將得到以下結果 -

輸出

demoMethod for singleton

示例3

下面的實現顯示了一個執行緒安全的單例物件建立。在這個例子中,ClassicSingleton類維護對唯一單例例項的靜態引用,並從靜態getInstance()方法返回該引用,我們使用synchronized關鍵字使其成為執行緒安全的。

class ClassicSingleton {

   private static ClassicSingleton instance = null;
   private ClassicSingleton() {
      // Exists only to defeat instantiation.
   }

   public static synchronized ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
   
   protected void demoMethod( ) {
      System.out.println("demoMethod for singleton");
   }
}
public class Tester {

   public static void main(String[] args) {
      ClassicSingleton tmp = ClassicSingleton.getInstance( );
      tmp.demoMethod( );
   }
}

如果您編譯並執行上述程式,您將得到以下結果 -

輸出

demoMethod for singleton
廣告