所谓类的单例设计模式,就是采取一定的方法保证在整个软件系统中,对于某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
单例模式有8种
JDK中,java.lang.Runtime源码就是采用这种单例模式。
class Singleton{ // 1.构造器私有化(防止外部 new对象) private Singleton(){ } // 2.类的内部创建对象 private final static Singleton instance = new Singleton(); // 3.向外暴露一个静态的公共方法。getInstance public static Singleton getInstance(){ return instance; } }
优缺点:
class Singleton2{ // 1.构造器私有化(防止外部 new对象) private Singleton2(){ } // 2.类的内部创建对象 private static Singleton2 instance; static { instance = new Singleton2(); } // 3.向外暴露一个静态的公共方法。getInstance public static Singleton2 getInstance(){ return instance; } }
优缺点同静态常量。
class Singleton3{ private static Singleton3 instance; private Singleton3(){ } public static Singleton3 getInstance(){ if (instance == null){ instance = new Singleton3(); } return instance; } }
优缺点:
class Singleton4{ private static Singleton4 instance; private Singleton4(){ } public static synchronized Singleton4 getInstance(){ if (instance == null){ instance = new Singleton4(); } return instance; } }
优缺点:
错误写法,不展示。
class Singleton6{ private static volatile Singleton6 instance; private Singleton6(){} //提供一个静态的公有方法,加入双重检查代码,解决线程安全问题,同时解决懒加载问题。 public static Singleton6 getInstance(){ if (instance == null){ synchronized (Singleton6.class){ if (instance == null){ instance = new Singleton6(); } } } return instance; } }
优缺点:
class Singleton7 { private Singleton7(){} //静态内部类,该类中有一个静态属性Singleton7 //静态内部类调用时才会装载,JVM装载是线程安全的过程。 private static class SingletonInstance{ private static final Singleton7 instance = new Singleton7(); } public static Singleton7 getInstance(){ return SingletonInstance.instance; } }
优缺点:
enum Singleton8 { INSTANCE; public void sayOK(){ System.out.println("OK"); } } public class Singleton8Demo{ public static void main(String[] args){ Singleton8 instance = Singleton8.INSTANCE; Singleton8 instance2 = Singleton8.INSTANCE; System.out.println(instance == instance2); } }
优缺点:
借助JDK1.5中添加的枚举类来实现单例模式,不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,防止反射,推荐使用。