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的时候都是单例的,我们也可以在配置文件中定义,如下:

复制代码 代码如下:
<bean id="foo" class="foo" singleton="true" />

这告诉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、三种方式的单例模式的优缺点有哪些?一般用途区别在哪?。

时间: 2024-10-27 06:17:57

android设计模式之单例模式详解的相关文章

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

这是我们最常见的一类模式,对这一类模式有一个通用的特点就是: 封装创建的方式和过程. 这里所谓封装就是隐藏的意思,对对象的创建方法和过程不可见,或者是虚拟的过程. 隐藏创建方式,就是如单例,工厂方法,隐藏创建过程则是指builder,原型,至于抽象工厂,我认为他包含了以上两种. 我们想想一个对象的创建有哪些步骤? 1.创建什么东西?--接口定义 2.谁创建?        --决策类or帮助类 3.如何创建?     --how,创建过程 4.什么时候创建?    --创建时机的触发 由此可知,

深入理解JavaScript系列(25):设计模式之单例模式详解

 这篇文章主要介绍了深入理解JavaScript系列(25):设计模式之单例模式详解,本文给出了多种单例模式的实现方式,需要的朋友可以参考下     介绍 从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现.OK,正式开始. 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象.在JavaScript里,单例

android开发设计模式之——单例模式详解_Android

单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到.比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenHelper)等都会用到单例模式.下面针对一些例子分析一下我们在开发过程中应用单例模式需要注意的点.  一.作用  单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点 二.适用场景 1. 应用中某个实例对象需要频繁的被访问. 2. 应用中每次启动只会存在一个实例.如账

android开发设计模式之——单例模式详解

单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到.比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenHelper)等都会用到单例模式.下面针对一些例子分析一下我们在开发过程中应用单例模式需要注意的点. 一.作用 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点 二.适用场景 1. 应用中某个实例对象需要频繁的被访问. 2. 应用中每次启动只会存在一个实例.如账号系

深入理解JavaScript系列(25):设计模式之单例模式详解_基础知识

介绍 从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现.OK,正式开始. 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象.在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象. 正文 在JavaScript里,实现单例的方式有很多种,其中最简单的一个方

java 设计模型之单例模式详解_java

Singleton 模式的宗旨在于确保某个类只有一个实例,别且为之提供一个全局访问点.为了防止其他工作人员实例化我们的类, 可以为该类创建唯一一个构造器,并将构造器的可见设置为私有.值得注意的是,如果我们创建了其他的非私有的构造器,或者根本没有为该类提 供构造器,那么其他人员还是能实例化我们的类. 如果不希望提前创建单例对象,我们可以等到第一次使用该单例对象的时候在创建它,即 滞后初始化.滞后初始化单例对象有两个理由: 1.也许在静态初始化时间,你没有关于如何初始化单例对象的足够信息. 2.选择

PHP单例模式详解及实例代码_php实例

PHP单例模式详解 单例模式的概念 单例模式是指整个应用中某个类只有一个对象实例的设计模式.具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 单例模式的特点 单例模式的主要特点是"三私一公": 需要一个保存类的唯一实例的私有静态成员变量 构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义 克隆函数必须声明为私有的,防止对象被克隆 必须提供一个访

PHP单例模式详解及实例代码

PHP单例模式详解 单例模式的概念 单例模式是指整个应用中某个类只有一个对象实例的设计模式.具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 单例模式的特点 单例模式的主要特点是"三私一公": 需要一个保存类的唯一实例的私有静态成员变量 构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义 克隆函数必须声明为私有的,防止对象被克隆 必须提供一个访

Android Animations动画使用详解

一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 二. Android动画模式 Animation主要有两种动画模式:tweened 和 frame 一种是tweened animation(渐变动画) 三.XML文件中定义动画 ① 打开Eclipse,新建Android工程 ② 在res目录中新建anim文件夹 ③ 在anim目录中新建一个myanim.xml(注意文件名小写) ④ 加入XML的动画代码