首页 > 系统 > Android > 正文

Android设计模式之单例模式

2019-11-07 22:59:21
字体:
来源:转载
供稿:网友

Android设计模式主要分为创建型模式、行为型模式以及结构性模式。 创建型模式主要有单例模式、Builder模式、原型模式、工厂方法模式以及抽象工厂方法模式。

1. 单例模式

定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

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

UML类图 这里写图片描述

示例 以下为单例模式的各种实现方法:/** * 单例模式的实现之懒汉模式 */public class Singleton { PRivate static Singleton instance; private Singleton(){} public static synchronized Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; }}/** * 优点:只有在使用时才会被实例化,在一定程度上节约资源 * 缺点:1. 第一次加载时需要及时进行实例化,反应稍慢; * 2. 每次调用getInstance()都进行同步,造成不必要的同步开销。 *//** * 单例模式之Double Check Lock模式 */public class Singleton2 { private volatile static Singleton2 instance; private Singleton2(){} public static Singleton2 getInstance(){ if(instance == null){ synchronized (Singleton2.class){ if(instance == null){ instance = new Singleton2(); } } } return instance; }}/** * 第一层判断:为了避免没有必要的同步 * 第二层判断:为了保证instance为null的时候创建实例 * * DCL失效: * instance = new Singleton2(); 这句代码并非一个原子操作,大致做以下三件事: * * 1. 给Singleton2的实例分配内存 * 2. 调用构造函数,初始化字段 * 3. 讲instance指向分配内存 * * 优点:效率高 * 缺点:在高并发的情况下有一定的缺陷,虽然概率较小 *//** * 静态内部类单例模式 */public class Singleton3 { private Singleton3(){} public static Singleton3 getInstance(){ return SingletonFactory.instance; } private static class SingletonFactory{ private static final Singleton3 instance = new Singleton3(); }}/** * 优点:第一次加载时并不会初始化instance,只有在第一次调用getInstance方法时,才会导致单例被初始化 * 能够保证线程安全,单例对象的唯一性,延迟了单例的实例化 *//** 枚举单例模式 */public enum Singleton4 { INSTANCE; public void doSomething(){ System.out.println("do sth."); }}/** * 默认枚举实例的创建是线程安全的; * 枚举:反序列化也不会重新生成新的实例,而前几种方法通过反序列化都可以重新创建对象。 *//** * 使用同期实现单例模式 */public class SingletonManager { private static Map<String, Object> objMap = new HashMap<String, Object>(); private SingletonManager(){} public static void registerService(String key, Object instance){ if(!objMap.containsKey(key)){ objMap.put(key, instance); } } public static Object getService(String key){ return objMap.get(key); }}Android源码中的单例模式 在Android系统中,我们经常会通过Context获取系统级别的服务,如WindowsManagerService、ActivityManagerService等,更常用的是LayoutInflater的类,这些服务会在合适的时候以单例的形式注册在系统中,在我们需要的时候通过getSystemService(String name)获取。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表