單例模式在各個方面都有着極為廣泛的使用,所謂單例,顧名思義就是整個程式中隻有一個該類的執行個體,是以它成功保證了整個程式的生命周期内該類的對象隻能建立一次,并且提供全局唯一通路該類的方法: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);
}
單例模式的使用非常廣泛,但具體的内容基本就這些,本文主要是我學習過程中的一點總結。
大家可以在此基礎上加以改造使用,如果有其他的應用場景,歡迎在評論區中分享,一起進步~!