設計模式01 建立型模式 - 單例模式(Singleton Pattern)
阿新 • • 發佈:2018-11-12
參考
單例模式(Singleton Pattern)
確保一個類有且僅有一個例項,並且為客戶提供一個全域性訪問點。
特點
1) 保證被訪問資源物件在記憶體中只有一個例項,節約了系統記憶體資源,也避免了對資源多重佔用;
2) 封裝了訪問例項方法,提供全域性訪問點,嚴格控制客戶的訪問方式;
3) 通常常駐記憶體,不會頻繁建立/銷燬,節約了系統開銷;
缺點
1) 沒有抽象層,難以擴充套件;
2) 類的職責過重,往往一個單例負責所有與之相關功能,違背了類設計的“職責單一”原則;
3) 單例如果持有context,容易造成記憶體洩漏;
4) 全域性共享一個例項資源,難以隔離問題,進行單獨測試;
適用場景
1)全域性隨時可能需要訪問,訪問方式複雜,而且資源受限;
2)需要常駐記憶體,避免頻繁建立、銷燬的資源;
demo
單例模式通用UML類圖
單例模式的8種寫法與多執行緒
單例模式為了不讓外部隨意構建例項,一般需要將建構函式宣告為private,在獲取例項物件時,就無法通過動態函式來讀取(因為此時例項還未初始化),故只能通過類方法(static方法)來獲取例項引用。
1. 餓漢式 靜態常量
//餓漢式 靜態常量 public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton() { } public static Singleton getInstance() { return INSTANCE; } public void displaySingleton(){ System.out.println("This is a Singleton."); } }
特點:簡單,類裝載時完成初始化,不存在多執行緒同步問題;
優點:沒有延遲例項化,如果程式一直沒有使用,會造成資源浪費;
2.餓漢式 靜態程式碼塊
與餓漢式 靜態常量類似,只是把例項初始化放在了類的靜態程式碼塊中,而非放在例項引用定義處。
// 餓漢式 靜態程式碼塊 public class Singleton1 { private static Singleton1 instance; static{ instance = new Singleton1(); } private Singleton1(){} public static Singleton1 getInstance(){ return instance; } public void displaySingleton(){ System.out.println("單例初始化方式: 餓漢式 靜態程式碼塊"); } }
總結