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、總結

當這個類的對象在多個地方創建的時候,使得內部的方法多次調用,但是我們希望只要一個對象操作這個方法,或者不希望多個地方同時調用這個方法,我們需要保持這個方法的單一性質,我們就用單利模式吧。




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com