在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式。适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象。
一,懒汉式:
其特点是延迟加载,即当需要用到此单一实例的时候,才去初始化此单一实例。
1 public class SingleTon { 2 3 // 静态实例变量 4 private static SingleTon instance; 5 6 // 私有化构造函数 7 private SingleTon() { 8 9 } 10 11 // 静态public方法,向整个应用提供单例获取方式 12 public static SingleTon getInstance() { 13 if (instance == null) { 14 instance = new SingleTon(); 15 } 16 return instance; 17 } 18 19 }
懒汉式线程安全
1 public class SingleTon { 2 3 // 静态实例变量加上volatile 4 private static volatile SingleTon instance; 5 6 // 私有化构造函数 7 private SingleTon() { 8 9 } 10 11 // 双重检查锁 12 public static SingleTon getInstance() { 13 if (instance == null) { 14 synchronized(Singleton.class){ 15 if(singleton == null){ 16 instance = new SingleTon(); 17 } 18 } 19 } 20 return instance; 21 } 22 23 }
二,饿汉式:
饿汉式的特点是应用中尚未需要用到此单一实例的时候即先实例化。
1 public class SingleTon { 2 3 // 静态实例变量,直接初始化 4 private static SingleTon instance = new SingleTon(); 5 6 // 私有化构造函数 7 private SingleTon() { 8 9 } 10 11 // 静态public方法,向整个应用提供单例获取方式 12 public static SingleTon getInstance() { 13 return instance; 14 } 15 16 }
静态内部类单例模式
1 public class SingleTon { 2 3 // 利用静态内部类特性实现外部类的单例 4 private static class SingleTonken{ 5 private static SingleTon singleTon = new SingleTon(); 6 } 7 8 // 私有化构造函数 9 private SingleTon() { 10 11 } 12 13 public static SingleTon getInstance() { 14 return SingleTonken.singleTon; 15 } 16 17 }
静态代码块单例模式
1 public class SingleToken { 2 private static SingleToken singleTon; 3 //私有化构造函数 4 private SingleToken(){} 5 //静态代码块 6 static{ 7 singleTon = new SingleToken(); 8 } 9 //获取实例化构造函数 10 public static SingleToken getInstatce(){ 11 return singleTon; 12 } 13 14 }
枚举单例模式
1 public enum EnumSingleTon { 2 INSTANCE; 3 public static EnumSingleTon getInstance(){ 4 return INSTANCE; 5 } 6 }