Java單例的目的是控製對象的創建,數量限製,但允許靈活性,以創造更多的對象,如果情況的變化.
由於隻有一個Singleton實例,任何一個Singleton實例字段將發生每班隻有一次,就像靜態字段。單身往往控製訪問資源,如數據庫連接或套接字.
例如,如果你有許可證,隻有一個數據庫連接或你的JDBC驅動程序具有多線程的麻煩,單例可以確保隻有一個連接或在一個時間隻有一個線程可以訪問連接.
最簡單的實現包括一個私有構造函數和字段來保存其結果,靜態存取方法與名稱類似的getInstance().
私有領域的可分配在靜態初始化塊,或者更簡單,使用初始化。簡單的getInstance()方法(它必須是公開的),然後返回這個實例:
// File Name: Singleton.java public 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 static void demoMethod( ) { System.out.println("demoMethod for singleton"); } } // File Name: SingletonDemo.java - by www.gitbook.net public class SingletonDemo { public static void main(String[] args) { Singleton tmp = Singleton.getInstance( ); tmp.demoMethod( ); } }
這將產生以下結果:
demoMethod for singleton
實施以下顯示了一個典型的單例(Singleton)設計模式:
public class ClassicSingleton { private static ClassicSingleton instance = null; protected ClassicSingleton() { // Exists only to defeat instantiation. by www.gitbook.net } public static ClassicSingleton getInstance() { if(instance == null) { instance = new ClassicSingleton(); } return instance; } }
ClassicSingleton類維護一個孤獨的單例實例的靜態引用,並返回從靜態getInstance()方法參考.
這裡ClassicSingleton類采用的技術被稱為惰性的實例創建的單例;作為一個結果,直到第一次調用getInstance()方法不創建Singleton實例。此方法可確保隻在需要時創建單例實例.