单例模式在各个方面都有着极为广泛的使用,所谓单例,顾名思义就是整个程序中只有一个该类的实例,所以它成功保证了整个程序的生命周期内该类的对象只能创建一次,并且提供全局唯一访问该类的方法: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);
}

单例模式的使用非常广泛,但具体的内容基本就这些,本文主要是我学习过程中的一点总结。

大家可以在此基础上加以改造使用,如果有其他的应用场景,欢迎在评论区中分享,一起进步~!

最新文章

  1. 每日Scrum站会实践推荐
  2. R平方
  3. UE4 - C++ 射线捕捉
  4. Scrum学习总结
  5. Listview实现不同类型的布局
  6. 设置Sql Agent运行Job时的执行账户
  7. IOS界面切换
  8. UVa 12563 Jin Ge Jin Qu hao【01背包】
  9. python3可变与不可变数据类型
  10. Swift—重写-备
  11. Lotto(dfs)
  12. ECMAScript6之let与const关键字
  13. 给负载均衡器添加多IP
  14. linux 系统centOS 7 怎么在线安装mysql
  15. YYS FZU - 2278 (期望)JAVA
  16. Nginx 安装与详解
  17. Vue computed属性
  18. C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
  19. How to load custom styles at runtime (不会翻译,只有抄了 )
  20. SQL Server 2016 中有外键的表无法被Truncate,只能被Delete

热门文章

  1. Flink的Job启动TaskManager端(源码分析)
  2. Redis高可用架构
  3. 步入vue.js世界
  4. 在IIS下部署PHP
  5. CF 551 D.Serval and Rooted Tree 树形DP
  6. P3355 骑士共存问题 二分建图 + 当前弧优化dinic
  7. poj1273 Drainage Ditches (最大流板子
  8. CODE[VS] 1294 全排列
  9. codeforces 749D Leaving Auction(二分)
  10. webpack4 公共模块打包,怎么抽取出来一个需要经常修改的包