問題域:
--系統中你需要獲得某個類的唯一實例,所有客戶端對它的訪問都將通過一個公共的訪問點獲得
--創建一個類並使其:(A)定義一個私有的構造器(B)定義一個私有、靜態的變量指向自己(C)定義一個公有、靜態的訪問方法用於返回該類的一個唯一實例
分爲 餓漢式 和 懶漢式,下面是一個簡單的示例代碼,應該很容易理解:
package pattern.singleton.basic; /** * java設計模式:單例模式(餓漢式) * @author wasw100 */ public class Singleton { // 提供一個靜態私有變量指向自己,屬於類 private static Singleton instance = new Singleton();// 提前消費 // 提供私有構造器,只有在當前類中可以使用new,外界不能構造該類的對象 private Singleton() { } // 對外提供一個公共訪問點 public static Singleton getInstance() { return instance; } }
package pattern.singleton.basic; /** * java設計模式:單例模式(懶漢式) * @author wasw100 */ public class Singleton { private static Singleton instance = null; private Singleton(){} //synchronized避免在訪問量比較大的時候 第一個線程的new Singleton還沒來得及賦值給instance,第二個線程就來了,還要進行new …… public synchronized static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } }
package pattern.singleton.basic; public class ClientClass { public static void main(String [] args){ Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println(s1); System.out.println(s2); } } 輸出結果(地址相同,所以指向同一個對象): pattern.singleton.basic.Singleton@a90653 pattern.singleton.basic.Singleton@a90653
說明:
- 構造方法是私有的,外部類不能實例化,只能在類的內部實例化
- 餓漢式在類加載時實例化,懶漢式在第一次程序第一次執行getInstance()方法時實例化
- 懶漢式中synchronized避免在訪問量比較大的時候 第一個線程的new Singleton還沒來得及賦值給instance,第二個線程就來了,還要進行new ……