確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。
這樣做有以下幾個優點
• 對於那些比較耗記憶體的類,只例項化一次可以大大提高效能,尤其是在移動開發中;
• 保持程式執行的時候該中始終只有乙個例項存在記憶體中
有如下經典的實現方式:
public
class
singleton
public
static singleton getinstance() }}
return instance;
}}
以上實現由如下幾個十分關鍵的地方:
• 必須要將建構函式私有化,以防止外部可以呼叫建構函式進行例項化;
• 定義乙個靜態函式獲取該例項;
• 定義乙個全域性的靜態變數,並以voliate修飾;
• 在例項獲取函式中,必須進行同步處理,並在同步塊中進行雙重判空;(雙重判空的原因:防止外部函式在呼叫該獲取例項的函式時,恰好有乙個執行緒被阻塞等待,等此次建立好例項之後,那個等待的執行緒獲取鎖之後就不需要再建立該例項,因此在同步鎖內進行二次判空是有必要的)。
回到android中,是有很多地方用到了單例模式的,下面舉例說明:
1).eventbus中獲取例項:
private
static
volatile eventbus defaultinstance;
public
static eventbus getdefault() }}
return defaultinstance;
}
該單例的實現就是標準的精簡單例模式的實現;
2). inputmethodmanager獲取例項
static inputmethodmanager sinstance;
public
static inputmethodmanager getinstance()
return sinstance;
}}
在輸入法服務例項的單例模式中,就是精簡的模式,即將外部判空去除了,直接進入同步塊中,當然同步塊中的判空是必不可少的;
在android中,諸如其他的系統服務如:accessibilitymanager在獲取例項的時候就是採用的單例模式進行的。
應用單例模式,我們可以在建立自定義工具類來管理我們的activity,**示例如下:
public
class activitymanager
public
static activitymanager getinstance()
}return instance;
}public
void
addacticity(activity act)
public
void
removeactivity(activity act)
public
void
killmyprocess()
mactivitystack.clear();
android.os.process.killprocess(android.os.process.mypid());
}}
這個activity的管理工具類就是乙個十分典型的應用。注意,該activity棧是歸屬於乙個例項的,因此各個方法對該資料結構進行操作時,均是針對該例項所屬的記憶體,因此所有的操作方法均為非靜態。
最後,安利乙個十分好用的android framework原始碼檢視網頁:
androidxref.com,當前已更新到完全免費,臨時查閱很管用。
MVP 模式在Android中的使用
什麼是mvp 作為碼農你應該知道mvc model view control 吧,如果不知道,請自行補腦。mvp model view presenter 是mvc衍生而來的,mvp並不是乙個新玩意,很早以前就由某軟公司提出,近年來在android應用開發中越來越多的被提及,越來越重要了。本文簡單解...
尋找android中的設計模式(三)
尋找android中的設計模式 三 尋找工廠模式 工廠模式的家族分四種 靜態工廠模式 簡單工廠模式 工廠方法模式 抽象工廠模式。下面以開冒菜店為例,假設我定義了一家冒菜店 public class maocaistore else if type.equals zhongla else if typ...
Android中的設計模式 介面卡模式
從名字上就可以看出介面卡是為了針對介面不匹配的情況,而做出的相容方法,假設我們有乙個已經存在的類adaptee,其中有一些已經存在並實現好的方法methoda。但是客戶不希望呼叫這個類,而是希望呼叫乙個特定的介面例如target介面。於是如果想要呼叫adaptee.methoda 方法,建立乙個ad...