单例模式

来源:互联网 发布:动画需要什么软件 编辑:程序博客网 时间:2024/06/09 20:38

培训马上就结束了,准备把这些天学到的知识点都归纳总结一下。

单例模式,没什么好说的,应该是23种设计模式中最简单的,听说是有五六种写法,饿汉式、懒汉式什么的,我也没去做认真地归纳,也没什么必要,目前以来我接触到的大体有下面这几种:

最好的写法

完美单例模式,单例模式使用内部类来维护单例的实现,
JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的,这样当我们第一次调用getInstance的时候,JVM能够帮我们保证该对象只被创建一次

public class SingletonPerfect {    private SingletonPerfect() {    }    private static class SingletonFatory {        private static SingletonPerfect singleton = new SingletonPerfect();    }    public static SingletonPerfect getSingleton() {        return SingletonFatory.singleton;    }    // 如果该对象被用于序列化,可以保证对象在序列化前后保持一致     public Object readResolve() {        return getSingleton();    }}

最简单的写法

直接写成静态最终,谁也改不了,但是程序一开始就分配好空间,这样好不好,看具体应用场景。

public class SingletonOthers {    private static final SingletonOthers singleton = new SingletonOthers();    private SingletonOthers() {    }    public static SingletonOthers getInstance() {        return singleton;    }}

我最喜欢的写法

在创建实例的方法上加同步锁,二次判断实例是否为空,注意不要在getSingleton方法上加同步锁,减少资源占用。

public class SingletonOthers {    private static SingletonOthers singleton = null;    private SingletonOthers() {    }    public static SingletonOthers getSingleton() {        if (singleton == null)            createSingletom();        return singleton;    }    private synchronized static void createSingletom() {        if (singleton == null)            singleton = new SingletonOthers();    }}

补充:影子实例

提供一个update方法的单例模式,数据已经很旧了,然后读取新的配置信息,然后更新数据,所以要提供这么个方法。

/** * @author ChenSS */public class SingleletonFactory {    private static SingleletonFactory instance = null;    private static Vector<String> properties = null;    public Vector<String> getProperties() {        return properties;    }    private SingleletonFactory() {        properties=new Vector<>();    }    private static synchronized void createInstance() {        if (instance == null)            instance = new SingleletonFactory();    }    public static SingleletonFactory getInstance() {        if (instance == null)            createInstance();        return instance;    }    public void updateProperties() {        SingleletonFactory sh = new SingleletonFactory();        //TODO 此处做读取最新的配置信息等更新数据操作        properties = sh.getProperties();    }}
0 0