android 单页模式,android与模式:单例模式

这是我们最常见的一类模式,对这一类模式有一个通用的特点就是:

封装创建的方式和过程。

这里所谓封装就是隐藏的意思,对对象的创建方法和过程不可见,或者是虚拟的过程。

隐藏创建方式,就是如单例,工厂方法,隐藏创建过程则是指builder,原型,至于抽象工厂,我认为他包含了以上两种。

我们想想一个对象的创建有哪些步骤?

1,创建什么东西?--接口定义

2,谁创建?        --决策类or帮助类

3,如何创建?     --how,创建过程

4,什么时候创建?    --创建时机的触发

由此可知,创建型就是在上面几个点做文章

我将单例模式放在最前面来讲,是因为简单和直白。

1,单例模式

gof原文这么讲的:"Ensure a class only has one instance, and providea global point of access to it"

有2点:

a,仅且只能有1个实例

b,提供一个全局访问点

就是说一个对象只能生成一次,然后可以全局个方法或者类去调用。

从上面描述就知道,我们一般在需要只用对象的一个实例的时候才用到这个模式,类似我们常说的全局对象,在j2ee中我们知道默认spring初始化bean的时候都是单例的,我们也可以在配置文件中定义,如下:

这告诉spring容器,foo的实例只会生成一次。

那么在android中,有哪些地方用到了单例模式呢?

我们知道一个手机中,打开输入法,不管在哪打开,其实都是一个实例;Activity.java中有一个mSearchManager的对象它也是单例对象;如果是android原生系统,有个全局搜索global,如果看android源码,你会发现DisplayManagerGlobal,WindowManagerGlobal等等很多都是单例的,这些对象负责管理整个手机的运行处理。我们来看 WindowManagerGlobal 的实现:

public static WindowManagerGlobal getInstance() {

synchronized (WindowManagerGlobal.class) {

if (sDefaultWindowManager == null) {

sDefaultWindowManager = new WindowManagerGlobal();

}

return sDefaultWindowManager;

}

}

这样系统保证了WindowManagerGlobal 对象的产生只会有一个,在系统调用(决策对象)需要的时候,调用getInstance(全局访问点),来生成new 。这是一个很完整的单例模式的实现,一个很好的例子。

mSearchManager的实现也很有意思:

private void ensureSearchManager() {

if (mSearchManager != null) {

return;

}

mSearchManager = new SearchManager(this, null);

}

这里有人会说怎么这样嗯,没返回SearchManager对象啊,就是没有决策类这个角色。其实他是有的,他的决策类就是我们常用的getSystemService,看代码:

@Override

public Object getSystemService(String name) {

if (getBaseContext() == null) {

throw new IllegalStateException(

"System services not available to Activities before onCreate()");

}

if (WINDOW_SERVICE.equals(name)) {

return mWindowManager;

} else if (SEARCH_SERVICE.equals(name)) {

ensureSearchManager();

return mSearchManager;

}

return super.getSystemService(name);

}

其实这里getSystemService我们可以看做一个特殊的决策类,从以下代码来看:

if (SEARCH_SERVICE.equals(name)) {

ensureSearchManager();

return mSearchManager;

}

我们改成:

public static SearchManager getInstance(){

ensureSearchManager();

return mSearchManager;

}

这就是一个单例模式。但从getSystemService整个代码来看,确实工厂方法模式,这个我们在下面会讲到。

根据对象创建时机的不同,单例模式有三种方式:

1,,饿汉式    --就是实例在类加载的时候就生成

public class foo{

foo(){}

private static foo instance =new foo();

public static foo getlnstance(){

return instance;

}

}

2,懒汉式

public class foo{

foo(){}

private static foo instance = null ;

public static foo getlnstance(){

if(instance == null){

instance = new foo();

}

return instance;

}

}

3,注册式

public static foo getInstance(String name) {

if(name == null) {

name = foo .class.getName();

System.out.println("name == null"+"--->name="+name);

}

if(map.get(name) == null) {

try {

map.put(name, (foo ) Class.forName(name).newInstance());

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

return map.get(name);

}

第一种和第二种方式区别在于创建时机的差异,而第三种则是如何创建有区别。

最后,问几个问题:

1,android还有哪些其他的单例模式

2,launcher mode中有没有单例模式的实现

3,单例模式的拓展中,数据库连接池属于哪种方式的变异(衍生).

4,三种方式的单例模式的优缺点有哪些?一般用途区别在哪?。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值