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)获取。