單例模式在各個方面都有着極爲普遍的使用,所謂單例,顧名思義就是整個程序中只有一個該類的實例,因此它成功保證了整個程序的生命週期內該類的對象只能建立一次,而且提供全局惟一訪問該類的方法: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 的使用能夠說很是普遍,例如得到程序網絡功能,得到制定控件屬性等等,用途能夠說是很是普遍spa
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);
}
複製代碼
單例模式的使用很是普遍,但具體的內容基本就這些,本文主要是我學習過程當中的一點總結。
你們能夠在此基礎上加以改造使用,若是有其餘的應用場景,歡迎在評論區中分享,一塊兒進步~!