學習筆記:設計模式-單例模式-java實現
阿新 • • 發佈:2020-12-12
設計模式-單例模式
單例模式
定義
一個類只有一個例項,且該類能自行建立這個例項的一種模式。
特點
- 單例類只有一個例項物件
- 該單例物件必須由單例類自行建立
- 對外提供一個訪問該單例的全域性訪問點
優點
- 可以保證記憶體中只有一個例項,減少了記憶體的開銷
- 可以避免對資源的多重佔用
- 設定全域性訪問點,可以優化和共享資源的訪問
缺點
- 單例模式一般沒有介面,擴充套件困難。如果要擴充套件,除了修改原來的程式碼,沒有第二種途徑,違背開閉原則
- 在併發測試中,不利於程式碼除錯。在除錯過程中,如果單例中的程式碼沒有執行完,也不能模擬生成一個新的物件
- 單例模式的功能程式碼通常寫在一個類中,如果功能設計不合理,則很容易違背單一職責原則
應用場景
- 需要頻繁建立的一些類,使用單例可以降低系統的記憶體壓力,減少 GC
- 某類只要求生成一個物件的時候
- 某些類建立例項時佔用資源較多,或例項化耗時較長,且經常使用
- 某類需要頻繁例項化,而建立的物件又頻繁被銷燬的時候,如多執行緒的執行緒池
- 頻繁訪問資料庫或檔案的物件
- 對於一些控制硬體級別的操作,或者從系統上來講應當是單一控制邏輯的操作,如果有多個例項,則系統會完全亂套
- 當物件需要被共享的場合。由於單例模式只允許建立一個物件,共享該物件可以節省記憶體,並加快物件訪問速度。如資料庫的連線池
單例模式實現
懶漢式單例
public class Main {
public static void main(String[] args) {
LazySingleton lazySingleton=LazySingleton.getInstance();
}
}
class LazySingleton{
private static volatile LazySingleton lazySingleton = null;//保證例項在所有執行緒中同步
private LazySingleton(){
//private訪問許可權防止類在外部被例項化
}
/**
*
* @return
*/
public static synchronized LazySingleton getInstance(){
//方法前加同步
if(lazySingleton==null){
System.out.println("建立例項");
lazySingleton=new LazySingleton();
}
return lazySingleton;
}
}
餓漢式單例
public class Main {
public static void main(String[] args) {
HungrySingleton hungrySingleton=HungrySingleton.getInstance();
}
}
class HungrySingleton{
private static HungrySingleton hungrySingleton = new HungrySingleton();//保證例項在所有執行緒中同步
private HungrySingleton(){
//private訪問許可權防止類在外部被例項化
}
/**
*
* @return
*/
public static HungrySingleton getInstance(){
System.out.println("返回已經生成的例項");
return hungrySingleton;
}
}