Android 设计模式之-单例模式

来源:互联网 发布:安卓权威编程指南pdf 编辑:程序博客网 时间:2024/05/16 11:49

单列模式介绍:

单列模式是应用最广的模式之一,也可能是很多初级工程师唯一会使用的设计模式。在应用这个模式时,单列对象的类必须保证一个实例存在,许多时候整个系统只需要拥有一个全局对象,这也有利于我们协调系统整体的行为, 如在一个应用中,应该只有一个ImageeLoader 实例,这个ImageLoader 中又含有线程池,缓存系统,网络请求等,很消耗资源,因此,没有理由让它构造多个实例。这种不能自由构造对象的情况,就是单例模式的使用场景。

使用场景:

确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源, 或者某种类型的对象只应该有且只有一个。例如: 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源,这时就要考虑使用单例模式。

UML类图:

这里写图片描述

角色介绍:
(1) Client –高层客户端;
(2)Singleton –单例类;
实现单例模式主要有如下几个关键点:
(1) 构造函数不对外开发,一般使用private ;
(2)通过一个静态方法或者枚举返回单例类对象;
(3)确保单例类的对象有且只有一个,尤其是在多线程环境下;
(4)确保单例类对象在反序列环时不会被重新构建对象;

通过将单例类的构造函数私有化,使得客户端代码不能通过new 的形式手动构造单例类的对象。单例类会暴露一个公有静态方法,客户端需要调用这个静态方法获取到单例类的唯一对象,在获取这个单例对象的过程中需要确保线程安全,即在多线程环境下构造单例类的对象也是有且只有一个, 这也是单例模式实现中比较困难的地方。

示例:
单例模式是设计模式中比较简单的,只有一个单例类,没有其他的层次结构和抽象。 该模式需要确保该类智能生成一个对象, 通常是该类需要消耗较多的资源或者没有多个实例的情况下。 例如:一个公司只有一个CEO,一个应用只有一个Application对象等。请看下面示例:

懒汉单例模式

    public class Singleton {      private static Singleton instance;      private Singleton() {} //一定要有私有构造,要不谈何单例      public static synchronized Singleton getInstance(){          if (null == instance){              instance = new Singleton();          }          return instance;      }  }  

getInstance ( ) 方法中添加了 synchronized 关键字, 也就是getInstance 是一个同步方法, 这就是上面所说的在多线程情况下保证单例对象唯一性的手段, 仔细一下,大家可能会发现一个问题, 即使instance 已经被初始化(第一次调用的时候就会被初始化instance),每次调用getInstance 方法都会进行同步,这样会消耗不必要的资源,这也是懒汉单例模式存在的最大问题。

最后总结一下,懒汉单例模式的优点是单例只有在使用时才会被实例化, 在一定程度上节约了资源 ;缺点是第一次加载时需要及时初始化,反应稍慢, 最大的问题是每次调用getInstance 都进行同步,造成不必要的同步开销。

0 0
原创粉丝点击