Android之什麼場景該使用單例模式總結

chenyu_insist發表於2016-07-31

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

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




相關文章