单例模式在各个方面都有着极为普遍的使用,所谓单例,顾名思义就是整个程序中只有一个该类的实例,因此它成功保证了整个程序的生命周期内该类的对象只能建立一次,而且提供全局惟一访问该类的方法: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);
}
复制代码
单例模式的使用很是普遍,但具体的内容基本就这些,本文主要是我学习过程当中的一点总结。
你们能够在此基础上加以改造使用,若是有其余的应用场景,欢迎在评论区中分享,一块儿进步~!