單例模式在各個方面都有着極為廣泛的使用,所謂單例,顧名思義就是整個程序中只有一個該類的實例,所以它成功保證了整個程序的生命周期內該類的對象只能創建一次,並且提供全局唯一訪問該類的方法:getInstance()
使用
關於單例模式主要分為兩類:
- 懶漢模式
- 餓漢模式
由於餓漢模式是線程安全的,所以通常情況下,我們都盡量采用餓漢模式,具體原因常見這位大佬的博文:點擊前往
本文主要結合 Android 分析下當例模式在 Android 中獲得全局可用的 Context 對象
搭建餓漢模式基本框架
單例模式基本方法包括
- 一個該類對象
- 該類構造方法
- 獲得單例的方法
/**單例模式
*
* 向整個應用提供 App (application) 單例
*/
public class AppContext {
private static AppContext instance;
public AppContext(Context application){
}
public static AppContext getInstance() {
if (instance == null){
throw new RuntimeException();
}
return instance;
}
}
對外暴露實例化單例的方法
外界調用時,將全局的 context 對象傳入
public static void init(Context context){
if (instance != null){
throw new RuntimeException();
}
instance = new AppContext(context);
}
修改構造方法:
- 將全局的 Context 對象保存到該單例中
private Context applicationContext;
public AppContext(Context application){
this.applicationContext = application;
}
完整代碼
在之前的基礎上,暴露獲得 Context 對象的方法
/**單例模式
*
* 向整個應用提供 App (application) 單例
*/
public class AppContext {
private static AppContext instance;
private Context applicationContext;
public AppContext(Context application){
this.applicationContext = application;
}
public Context getApplicationContext() {
return applicationContext;
}
public static AppContext getInstance() {
if (instance == null){
throw new RuntimeException();
}
return instance;
}
public static void init(Context context){
if (instance != null){
throw new RuntimeException();
}
instance = new AppContext(context);
}
public static boolean isInitialized(){
return (instance != null);
}
}
單例的實例化
那么我們如何生成該單例能,由於單例是全劇唯一的,根據這個特性我們一般在 Application 中實例化它
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
if (!AppContext.isInitialized()){
AppContext.init(getApplicationContext());
}
}
}
單例 context 的使用
context 的使用可以說非常廣泛,例如獲得程序網絡功能,獲得制定控件屬性等等,用途可以說是非常廣泛
- 獲得網絡狀態
NetworkUtil.isNetworkAvailable(AppContext.getInstance().getApplicationContext()
public class NetworkUtil {
/**
* 檢查網絡是否可用
*
* @param context
* @return
*/
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager manager = (ConnectivityManager) context
.getApplicationContext().getSystemService(
Context.CONNECTIVITY_SERVICE);
if (manager == null) {
return false;
}
NetworkInfo networkinfo = manager.getActiveNetworkInfo();
if (networkinfo == null || !networkinfo.isAvailable()) {
return false;
}
return true;
}
}
- 在工具類中獲得控件屬性值
/**
* color.xml里面的id
*/
public static int getColor(int colorResId){
Context context = OrderContext.getInstance().getApplicationContext();
return context.getResources().getColor(colorResId);
}
單例模式的使用非常廣泛,但具體的內容基本就這些,本文主要是我學習過程中的一點總結。
大家可以在此基礎上加以改造使用,如果有其他的應用場景,歡迎在評論區中分享,一起進步~!