Android设计模式(二)

来源:互联网 发布:淘宝手机宝贝链接在哪 编辑:程序博客网 时间:2024/05/21 18:49

单例模式:确保某个类只有一个实例,并且自行实例化并向整个系统提供这个实例。

使用场景:确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,如:要访问IO和数据库等资源。

懒汉模式:

 

public class CEO extends Staff {    private static final CEO ceo =new CEO();    private CEO(){    }    public static CEO getCeo(){        return ceo;    }    @Override    public void work() {        super.work();    }}
恶汉模式:

public class Singleton {    private static Singleton instance;    private Singleton() {    }    public static synchronized Singleton getInstance(){        if (instance == null){            instance = new Singleton();        }        return instance;    }}
优点:使用时才会被实例化,一定程度上节约了资源

缺点:第一次加载时需要及时进行实例化,反应稍慢,每次调用getInstance时都会进行synchronized,造成不必要的开销同步。

DoubleCheckLock(DCL):

public class Singleton {    private static Singleton singleton = null;    private Singleton(){    }    public void doSomeThing(){        Log.e("doSomeThing--->","doSomeThing");    }    public static Singleton getInstance(){        if (singleton == null){//避免不必要的同步            synchronized (Singleton.class){                if (singleton == null){//在instance为空的情况下创建实例                    singleton = new Singleton();                }            }        }        return singleton;    }}
假设线程执行到singleton = new Singleton()时,这句代码大概做了三件事:

a.给Singleton实例分配内存

b.调用Singleton的构造函数,初始化成员字段

c.将singleton的对象指向分配的内存空间(此时singleton就不再是null了)

优点:资源利用率高

缺点:第一次加载反应稍慢,由于java内存模型会导致失败(JDK1.5之前b和c的顺序是无法保证的),以及高并发情况下会有小概率的失败可能

静态内部类单例模式:

public class Singleton {    private Singleton(){            }    public static Singleton getInstance(){        return SingletonHolder.single;    }    private static class SingletonHolder{        private static final Singleton single = new Singleton();    }}
确保线程安全,保证单例对象的唯一性,延迟了单例的实例化。

枚举单例:

public enum  SingletonEnum {    INSTANCE;    public void doSomeThing(){        Log.e("doSomeThing--->","doSomeThing");    }}
调用SingletonEnum.INSTANCE.doSomeThing();

使用容器实现单例模式:

public class Singleton implements Serializable{    private static final Long SerialVersionUid = 0L;    private static final Singleton INSTANCE = new Singleton();    private Singleton(){    }    public static Singleton getInstance(){        return INSTANCE;    }    private Object readResolve() throws ObjectStreamException{        return INSTANCE;    }}



原创粉丝点击