java设计模式—单列模式

来源:互联网 发布:linux退出vim进入末行 编辑:程序博客网 时间:2024/04/29 11:22
  • 这个不管怎样对初学者来说都是要会写的!知道是一回事,写出来是另一回事!
    这里列举的5种方式:饿汉式;懒汉式;双重检验锁;静态内部类;枚举
    当然还有static{ } 区域内的初始化的数据
    访问final 字段时…
public class Test{    public static void main(String[] args)    {         Singleton single1 = Singleton.getInstance();         Singleton single2 = Singleton.getInstance();        System.our.println(single1 == single2 ) ---out:  true     }}class Singleton {    //这种(饿汉式)适合--如果单列对象初始化快,占用内存小,可以在应用启动时加载并初始化;    private  static Singleton single = new Singleton();    private Singleton(){    }    public static Singleton getInstance(){        return single;    }}//当单列初始化操作比较耗时,或占用内存大,一般不会使用,而是使用下面一种class Singleton {    //这种是(懒汉式)适合--按需延时加载单列   二者的区别在于(懒)是在将单例初始化操作延时到需要的时候才进行    //比如,单列用的擦数不多,单是提供的功能又复杂,加载和初始化操作要消耗大量资源 --使用方便!    private  static Singleton single = null;    private Singleton(){    }    public static Singleton getInstance(){        if(single == null )        {            single = new Singleton();        }        return single;    }}//上面都适合单线程,在多线程的时候就需要同步锁了class Singleton {    //这种是双重校验锁    private  static Singleton single null;    private Singleton(){    }    public static Singleton getInstance(){        if(single == null )        {//在这里加锁,如果之前已经实例化了就不必在执行synchronized下面的代码,提高性能            synchronized(Singleton.class){                single = new Singleton();            }        }        return single;    }}//还有就是静态内部类class Singleton {    //这里是内部类,在装载该内部类时,才会得到单列对象    //只要应用不适用内部类JVM就不会去加载这个单列(这个现在还不太懂...)    private static class  InnerClass    {        public static Singleton single = new Singleton();    }    private Singleton(){    }    public static Singleton getInstance(){        return InnerClass.single;//得到单列对象    }    public String doSomething(){        //do ....        return  "ssssss" ;    }}//调用是时候直接{    String  data = Singleton.getInstance().doSomething();}//还有最后一个就是枚举public enum Singleton{    //定义一个枚举元素,就是他自己的实例    instance;    public void doSomething(){        //do....    }}//使用的时候{    Singleton single = Singleton.instance;    single.doSomething();}

//根据stormzhang的微信公众号总结的 张哥公众号干货够喝一大壶!哦!微信号是 googledev

  • 观看刘欣讲解Effective java 后添加的内容
    • 单例的范围:只作用在一个jvm中!如果有2个jvm都调用了同一个单例对象,则会产生2个地址不同的该单例对象!!!
    • 如果单例对象被序列化了Serializable,那么单例就失效了!解决方法:就是在单例中添加 private Object ReadResolve(return instance对象;)——当然一般情况下单例的类不需要序列化…..
    • 单例会让单元测试百年的困难…
0 0