源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

android设计模式之单例模式详解

  • 时间:2022-01-24 22:28 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:android设计模式之单例模式详解
这是我们最常见的一类模式,对这一类模式有一个通用的特点就是: 封装创建的方式和过程。 这里所谓封装就是隐藏的意思,对对象的创建方法和过程不可见,或者是虚拟的过程。 隐藏创建方式,就是如单例,工厂方法,隐藏创建过程则是指builder,原型,至于抽象工厂,我认为他包含了以上两种。 我们想想一个对象的创建有哪些步骤? 1、创建什么东西?--接口定义 2、谁创建?        --决策类or帮助类 3、如何创建?     --how,创建过程 4、什么时候创建?    --创建时机的触发 由此可知,创建型就是在上面几个点做文章 我将单例模式放在最前面来讲,是因为简单和直白。 1、单例模式 gof原文这么讲的:
[u]复制代码[/u] 代码如下:
Ensure a class only has one instance, and providea global point of access to it
有2点: a、仅且只能有1个实例 b、提供一个全局访问点 就是说一个对象只能生成一次,然后可以全局个方法或者类去调用。 <有事离开,未完待续> 从上面描述就知道,我们一般在需要只用对象的一个实例的时候才用到这个模式,类似我们常说的全局对象,在j2ee中我们知道默认spring初始化bean的时候都是单例的,我们也可以在配置文件中定义,如下:
[u]复制代码[/u] 代码如下:
<bean id="foo" class="foo" singleton="true" />
这告诉spring容器,foo的实例只会生成一次。 那么在android中,有哪些地方用到了单例模式呢? 我们知道一个手机中,打开输入法,不管在哪打开,其实都是一个实例;Activity.java中有一个mSearchManager的对象它也是单例对象;如果是android原生系统,有个全局搜索global,如果看android源码,你会发现DisplayManagerGlobal,WindowManagerGlobal等等很多都是单例的,这些对象负责管理整个手机的运行处理。我们来看 WindowManagerGlobal 的实现:
[u]复制代码[/u] 代码如下:
public static WindowManagerGlobal getInstance() {         synchronized (WindowManagerGlobal.class) {             if (sDefaultWindowManager == null) {                 sDefaultWindowManager = new WindowManagerGlobal();             }             return sDefaultWindowManager;         }     }
这样系统保证了WindowManagerGlobal 对象的产生只会有一个,在系统调用(决策对象)需要的时候,调用getInstance(全局访问点),来生成new 。这是一个很完整的单例模式的实现,一个很好的例子。 mSearchManager的实现也很有意思:
[u]复制代码[/u] 代码如下:
private void ensureSearchManager() {         if (mSearchManager != null) {             return;         }         mSearchManager = new SearchManager(this, null);     }
这里有人会说怎么这样嗯,没返回SearchManager对象啊,就是没有决策类这个角色。其实他是有的,他的决策类就是我们常用的getSystemService,看代码:
[u]复制代码[/u] 代码如下:
@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我们可以看做一个特殊的决策类,从以下代码来看:
[u]复制代码[/u] 代码如下:
if (SEARCH_SERVICE.equals(name)) {             ensureSearchManager();             return mSearchManager;         }
我们改成:
[u]复制代码[/u] 代码如下:
public static SearchManager getInstance(){      ensureSearchManager();      return mSearchManager; }
这就是一个单例模式。但从getSystemService整个代码来看,确实工厂方法模式,这个我们在下面会讲到。 根据对象创建时机的不同,单例模式有三种方式: 1、饿汉式    --就是实例在类加载的时候就生成
[u]复制代码[/u] 代码如下:
public class foo{         foo(){}         private static foo instance =new foo();         public static foo getlnstance(){            return instance;         } }
2、懒汉式
[u]复制代码[/u] 代码如下:
public class foo{         foo(){}         private static foo instance = null ;         public static foo getlnstance(){             if(instance == null){                 instance = new foo();             }            return instance;         } }
3、注册式
[u]复制代码[/u] 代码如下:
    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)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部