《設計模式之禪》-2.單例設計模式
阿新 • • 發佈:2018-12-10
單例設計模式
定義:
確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項
通用程式碼:
public class Singleton{
private static Singleton singleton = new Singleton();
//私有化建構函式,不能從外部生成
private Singleton(){
}
public static Singleton getSingleton(){
return singleton;
}
}
單例模式優點:
1.由於單例模式在記憶體中只有一個例項,減少了記憶體開支,特別是一個物件需要頻繁地建立,銷燬時,而且建立或銷燬時效能無法優化,單例模式的優勢就非常明顯了
2.單例模式只生成一個例項,所以減少了系統的效能開銷,當一個物件的產生需要比較多的資源時,比如讀取配置,產生其他依賴物件時,則可以通過在應用中啟動時直接產生一個單例物件,然後用永久駐留記憶體的方式來解決
3.單例模式可以避免對資源的多重佔用,例如一個寫檔案動作,由於只有一個例項存在在記憶體中,避免對同一個資原始檔的同時寫訪問操作
4.單例模式可以在系統設定全域性的訪問點,優化和共享資源訪問
場景:
1.要求生產唯一的序列碼
2.需要共享訪問點和共享資料時,比如計數器
3.建立一個物件需要消耗的資源過多,如要訪問IO和資料庫
4.需要定義大量的靜態常量和靜態方法時的環境(我們一般直接定義為static)
單例模式有兩種實現模式
分為餓漢式和懶漢式
懶漢式 是在呼叫時再產生單例物件 例
public class Singleton{ private static Singleton singleton = null; //私有化建構函式,不能從外部生成 private Singleton(){} public static Singleton getSingleton(){ if(singleton == null){ singleton = new Singleton(); } return singleton; } }
但是懶漢式會節省資源,但是會出現執行緒不安全的情況,可以使用synchronized關鍵字解決
餓漢式,則是在類初始化時就已經產生單例物件了
public class Singleton{
private static Singleton singleton = new Singleton();
//私有化建構函式,不能從外部生成
private Singleton(){}
public static Singleton getSingleton(){
return singleton;
}
}