單例模式在各個方面都有着極爲普遍的使用,所謂單例,顧名思義就是整個程序中只有一個該類的實例,因此它成功保證了整個程序的生命週期內該類的對象只能建立一次,而且提供全局惟一訪問該類的方法:getInstance()java
關於單例模式主要分爲兩類:安全
因爲餓漢模式是線程安全的,因此一般狀況下,咱們都儘可能採用餓漢模式,具體緣由常見這位大佬的博文:點擊前往網絡
本文主要結合 Android 分析下當例模式在 Android 中得到全局可用的 Context 對象app
單例模式基本方法包括框架
/**單例模式 * * 向整個應用提供 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 對象傳入ide
public static void init(Context context){ if (instance != null){ throw new RuntimeException(); } instance = new AppContext(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 中實例化它this
public class App extends Application { @Override public void onCreate() { super.onCreate(); if (!AppContext.isInitialized()){ AppContext.init(getApplicationContext()); } } }
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); }
單例模式的使用很是普遍,但具體的內容基本就這些,本文主要是我學習過程當中的一點總結。
你們能夠在此基礎上加以改造使用,若是有其餘的應用場景,歡迎在評論區中分享,一塊兒進步~!