程序员路上如果过多的停留在基础代码上,是对于自己的一种恶心,有时候我们要学会偷懒、 还记得我在写天气APP教程的时候。使用过得一个设计模式,但是只是觉得大家应该都知道也就没做过多的总结。
单例模式:
简单理解:此类使用单例,全局都可调用此类
官方解释:单例模式确保一个类,只有一个实例,自行提供实例并向整个系统提供这个实例、
特点 :1.一个类只能有一个实例
2.自己创建这个实例
3.整个系统都要使用这个实例
拿几个例子解释吧:
windows里面的 回收站 整个系统都使用这个唯一的实例,而且回收站自定提供自己的实例。
再拿我写的天气APP用到的单例模式,首先weatherDB,作为一个工具类,又是查询天气的,肯定要经常用到,根据设计原则,尽量减少new 出空间,减少内存空间的消耗,所以我也使用单例模式来解决,自己实例,全局可以调用。
看看 我写的这个单例模式吧
public synchronized
static coolWeather getinstance(Context context){
if(cooWeatherDb=null){
cooWeatherDb=new CollweatherDb(context);
}
return cooWeatherDb;
}
回到正题:
单例有两种经常用:
1,饿汉式单例类
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪? //注意这是private 只供内部调用
private static Singleton instance = new
Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问 public static Singleton getInstance() {
return instance; } } |
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 //使用时生成实例,提高了效率! if (instance==null) instance= new Singleton(); return instance; }
} |
注意到lazy initialization形式中的synchronized,这个synchronized很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。
一般来说第一种比较安全
再看看我在彩票APP中用到的单例模式 PS:只截取一部分代码
public class TitleManager {
// 显示和隐藏
private static TitleManager instance = new TitleManager();
private TitleManager() {
}
public static TitleManager getInstance() {
return instance;
}
因为titleManager 在APP中要大量使用所以,将其全局化可以调用 也就是单例 我用的是饿汉单例形式
调用的时候 直接 方法名.getinstance 即可
TitleManager manager = TitleManager.getInstance();
博主 将在后面使用到单例模式 会继续更新这篇文章,让大家知道单例 应该啥时候用,虽然我已经说的比较应用场合了