设计模式之单例模式
1. 什么是单例模式
笼统的说就是一个类保证只创建一个实例,而且自行实例化并向整个系统提供实例。
2. 为什么要用单例模式
因为对于一些重量级资源重复创建的话不但占用资源,还浪费空间。比如一些Connection、FactoryBean。而与静态方法的区别是,我们不但使用静态方法还要使用非静态方法,但还要维护一份实例的时候,就需要单例模式了。
3. 单例模式的写法
3.1 懒汉
public class SingleTon { private SingleTon(){} private static SingleTon singleTon = null; public static SingleTon getSingleTon(){ if (singleTon==null){ singleTon = new SingleTon(); } return singleTon; } }
3.2 懒汉(线程安全)
4. public class SingleTon { private SingleTon(){} private static SingleTon singleTon = null; public static synchronized SingleTon getSingleTon(){ if (singleTon==null){ singleTon = new SingleTon(); } return singleTon; } }
3.3 饿汉
public class SingleTon { private SingleTon(){} private static SingleTon singleTon = new SingleTon(); public static synchronized SingleTon getSingleTon(){ return singleTon; } }
3.4 饿汉变异
public class SingleTon { private SingleTon(){} private static SingleTon singleTon = null; static { singleTon = new SingleTon(); } public static synchronized SingleTon getSingleTon(){ return singleTon; } }
3.5 静态内部类
public class SingleTon { private SingleTon(){} private static class SingletoHolder{ private static final SingleTon instance= new SingleTon(); } public static synchronized SingleTon getSingleTon(){ return SingletoHolder.instance; } }
3.6 枚举
public enum SingleTonEnum { INSTANCE; private void whate(){} }
3.7 双重锁校验
public class SingleTon { private SingleTon(){} private static SingleTon singleTon = null; public static SingleTon getSingleTon(){ if(singleTon==null){ synchronized (SingleTon.class){ if (singleTon==null){ singleTon = new SingleTon(); } } } return singleTon; } }
区别:
懒汉不获取对象不创建实例。 加同步只是为了在多线程正常工作,但是效率太低
饿汉 第三和第四没多少区别,都是作为静态加载。
枚举推荐使用,而且能防止反序列化创建新对象
静态内部类,主要是在于只有调用getInstance才会去实例化,而如果用静态内部方法或者静态属性时,如果调用本类的其他方法,它也会实例化,所以造成不必要的浪费和麻烦。显然这样比第一和第二更加合理。