当前位置:  编程技术>移动开发

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

    来源: 互联网  发布时间:2014-10-24

    本文导语:  这是我们最常见的一类模式,对这一类模式有一个通用的特点就是: 封装创建的方式和过程。 这里所谓封装就是隐藏的意思,对对象的创建方法和过程不可见,或者是虚拟的过程。 隐藏创建方式,就是如单例,工厂方法,隐...

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

封装创建的方式和过程。

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

隐藏创建方式,就是如单例,工厂方法,隐藏创建过程则是指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、三种方式的单例模式的优缺点有哪些?一般用途区别在哪?。


    
 
 

您可能感兴趣的文章:

  • android在root模式下接听来电的方法
  • Android开发之文件操作模式深入理解
  • Android图片轮播组件(多模式) android-image-indicator
  • 基于Android设计模式之--SDK源码之策略模式的详解
  • android系统在静音模式下关闭camera拍照声音的方法
  • android基础教程之夜间模式实现示例
  • Android 情景模式的设置代码
  • Android 如何定制vibrator的各种震动模式M 具体方法
  • android 如何判断当前是否为飞行模式
  • Android 听筒模式的具体实现实例
  • Android源码学习之观察者模式应用及优点介绍
  • android开发中使用java观察者模式
  • Android源码学习之单例模式应用及优点介绍
  • Android源码学习之工厂方法模式应用及优势介绍
  • Android源码学习之组合模式定义及应用
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 深入android Unable to resolve target 'android-XX'详解
  • Android工程:引用另一个Android工程的方法详解
  • Android TextView设置背景色与边框的方法详解
  • Android中的android:layout_weight使用详解
  • Android 实现永久保存数据的方法详解
  • 在android开发中尽量不要使用中文路径的问题详解
  • android开发环境搭建详解(eclipse + android sdk)
  • android双缓冲技术实例详解
  • 深入Android开发FAQ的详解
  • Android开发笔记之:一分钟学会使用Logcat调试程序的详解
  • Android对sdcard扩展卡文件操作实例详解
  • Android笔记之:onConfigurationChanged详解
  • Android 动画之AlphaAnimation应用详解
  • 解析后台进程对Android性能影响的详解
  • android ListView 一些重要属性详解
  • 解决Fedora14下eclipse进行android开发,ibus提示没有输入窗口的方法详解
  • Windows下获取Android 源码方法的详解
  • Android selector背景选择器的使用详解
  • Android 动画之RotateAnimation应用详解
  • Handler与Android多线程详解
  • 申请Android Map 的API Key(v2)的最新申请方式(SHA1密钥)
  • Android瀑布流实例 android_waterfall
  • Android开发需要的几点注意事项总结
  • Android系统自带样式 (android:theme)
  • android 4.0 托管进程介绍及优先级和回收机制
  • Android网络共享软件 Android Wifi Tether
  • Android访问与手机通讯相关类的介绍
  • Android 图标库 Android GraphView
  • Android及andriod无线网络Wifi开发的几点注意事项
  • 轻量级Android开发工具 Android Tools
  • Android 2.3 下StrictMode介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3