Android之什麼場景該使用單例模式總結
1、什麼是單例模式
單例模式意味著只有一個物件,至於單例模式如何實現就不這裡就不多說了,有很多種實現辦法。
2、什麼時候該使用單例模式?如果不使用單例模式會出現什麼問題?
先舉2個例子
例子1
當我們做得到最新的簡訊和最新的通話記錄的時候,我們一般採取一個類繼承ContentObserver,當資料庫裡面的內容變化時候,就會觸發裡面的onchange()函式,部分程式碼如下
public class Sms {
public Handler handler;
public HandlerThread handlerThread;
public statid final threadName = "smsThread";
public Sms(){
handlerThread = new HandlerThread (threadName );
handlerThread .start();
handler = new Handler(handlerThread.getLoop());
}
class sms extend contentObserver {
onchange(boolean self){
//邏輯程式碼
//上傳給服務端用handler
handler.post(new Runable(){
});
}
}
}
這裡沒有寫註冊的程式碼,問題是onchange會多回撥很多次,當我們在不同的地方多次構建Sms物件的時候,然後就有了很多不同的handler,然後再去傳送就會傳送重複資料,我們為了避免重複資料,這樣的情況下我們就需要採取單例模式得到handler,改成下面的情況
public class Sms {
public Handler handler;
public HandlerThread handlerThread;
public statid final threadName = "smsThread";
private Sms sms= new Sms();
private Sms(){
handlerThread = new HandlerThread (threadName);
handlerThread .start();
handler = new Handler(handlerThread.getLoop());
}
public static Sms getInstance() {
return sms;
}
class sms extend contentObserver {
onchange(boolean self){
//邏輯程式碼
//上傳給服務端用handler
handler.post(new Runable(){
});
}
}
}
例子2
當我們做通話錄音的功能,會通過自己寫的onstart(), 然後裡面實現我們的錄音功能,但是我們構建這個類的物件的時候有多次,但是我們每次只允許一個地方錄音,然後在我們類通過一個成員屬性變數,來控制,如下
public Record () {
public boolean isRunning = false;
public Record (){}
public onstart() {
isRunning = true;
//錄音邏輯
}
}
當我們多個地方呼叫的時候,每次都是構建Record,我們又初始化了isRunning,所以這個裡面的isRunning = true,無效
這個時候我們需要採用單例模式
public Record(){
public Record record = new Record();
public boolean isRunning = false;
private Record () {
}
public Record static getInstance() {
return record;
}
public onstart() {
isRunning = true;
//錄音邏輯
}
}
這樣就不會重複錄音了,其實還有一個辦法,就是把這個isRunning變成靜態變數,但是我們出發點還是希望一個物件好,所以我們還是用單例模式吧。
3、總結
當這個類的物件在多個地方建立的時候,使得內部的方法多次呼叫,但是我們希望只要一個物件操作這個方法,或者不希望多個地方同時呼叫這個方法,我們需要保持這個方法的單一性質,我們就用單利模式吧。
相關文章
- Android設計模式之——單例模式之原始碼使用場景(一)Android設計模式單例原始碼
- 結合 Android 看看單例模式怎麼寫Android單例模式
- Android設計模式之單例模式Android設計模式單例
- react中如何區分什麼場景下應該使用useEffect,什麼場景下應該使用釋出訂閱模式,進行通訊?React模式
- Android設計模式——策略模式之原始碼使用場景(三)Android設計模式原始碼
- 設計模式總結 —— 單例設計模式設計模式單例
- 什麼場景應該用MongoDB ?MongoDB
- 為什麼要用單例模式?單例模式
- 設計模式學習筆記(四)單例模式的實現方式和使用場景設計模式筆記單例
- 請舉例說明width:fit-conten有什麼使用場景
- PHP之單例模式PHP單例模式
- DCL之單例模式單例模式
- 美團一面:會單例模式嗎,寫個單例看看?(8大單例模式實現方式總結)單例模式
- 設計模式之單例模式設計模式單例
- 設計模式之☞單例模式設計模式單例
- 設計模式之---單例模式設計模式單例
- 建立者模式之單例模式模式單例
- Android備忘錄《單例模式》Android單例模式
- 《前端實戰總結》之迭代器模式的N+1種應用場景前端模式
- Javascript設計模式之單例模式JavaScript設計模式單例
- PHP 設計模式之——單例模式PHP設計模式單例
- golang設計模式之單例模式Golang設計模式單例
- js設計模式之單例模式JS設計模式單例
- Javascript 設計模式之單例模式JavaScript設計模式單例
- PHP 設計模式之單例模式PHP設計模式單例
- PHP設計模式之單例模式PHP設計模式單例
- 01 設計模式之單例模式設計模式單例
- Java設計模式之單例模式Java設計模式單例
- 設計模式(一)之單例模式設計模式單例
- 設計模式之單例設計模式單例
- flex:0 flex:1 flex:none flex:auto應該在什麼場景下使用?FlexNone
- Spring Boot之單元測試用例總結Spring Boot
- 讓 APISpace 告訴你什麼場景使用什麼APIAPI
- Android 進階之HandlerThread 使用場景及原始碼解析Androidthread原始碼
- 觀察者模式應用場景例項模式
- laravel singleton 單例模式使用Laravel單例模式
- JAVA物件導向高階:static的應用知識--單例模式 單例設計模式應用場景及好處 單例設計模式的實現方式Java物件單例設計模式
- 設計模式之單例模式詳解設計模式單例
- 理解設計模式之單例模式(Javascript)設計模式單例JavaScript