概念:设计模式是一套被反复使用,多数人知晓的、经过分类编目的、代码设计经验的总结。
目的:使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性。
单例模式的使用场景:
很多时候有些对象我们只需要一个,如配置文件,工具类、线程池、缓存、日志等。
如果创造出多个实例就会导致很多问题,如占用过多资源,不一致的结果等。
单例模式作用:可以保证整个应用中某个实例有且只有一个。
“饿汉”模式与“懒汉”模式的区别
“饿汉”模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全。
“懒汉”模式的特点是加载类时比较快,但运行时获取对象的速度比较慢(第一次调用获取类实例的方法时,应用中不存在类实例,需要创建),其线程是不安全的。
1)"饿汉"模式
1 package com.singleton; 2 3 /** 4 * @author zplogo 5 * 单例模式————“饿汉”模式,需要思考每一步为啥用相应的权限修饰符。 6 */ 7 public class Singleton { 8 // 1.将构造方法私有化,不允许外部直接创建对象 9 private Singleton(){ 10 11 } 12 13 // 2.内部调用自己的私有构造方法创建类的唯一实例,出于安全控制用private修饰,不允许外部直接访问类的成员变量,static保证类加载的时候就生成类的实例 14 private static Singleton instance = new Singleton(); 15 16 // 3.提供一个获取类的实例的方法,用public static修饰 17 public static Singleton getInstance(){ 18 return instance; 19 } 20 }
2)“懒汉”模式
1 package com.singleton; 2 3 /** 4 * @author zplogo 5 * 单列模式————“懒汉”模式,其特点类加载的时候并不创造类的实例,外部调用获取类实例的方法时才去检查创建类的唯一实例,如果存在就不创建。 6 */ 7 public class Singleton2 { 8 // 1.将构造方法私有化,不允许外部直接创建对象 9 private Singleton2(){ 10 11 } 12 13 // 2.仅声明类的实例,用private static修饰 14 private static Singleton2 instance; 15 16 // 3.提供一个获取类的实例的方法,用public static修饰 17 public static Singleton2 getInstance(){ 18 if(instance == null){ 19 instance = new Singleton2(); 20 } 21 return instance; 22 } 23 }
3)测试类
1 package com.singleton; 2 3 /** 4 * @author zplogo 5 * 测试类:用于测试单例模式。 6 */ 7 public class TestSingleton { 8 9 public static void main(String[] args) { 10 // 用于测试单例模式————“饿汉”模式 11 Singleton s1 = Singleton.getInstance(); 12 Singleton s2 = Singleton.getInstance(); 13 if(s1==s2){ 14 System.out.println("s1和s2是同一个实例"); 15 }else{ 16 System.out.println("s1和s2不是同一个实例"); 17 } 18 19 // 用于测试单例模式————“饿汉”模式 20 Singleton2 s3 = Singleton2.getInstance(); 21 Singleton2 s4 = Singleton2.getInstance(); 22 if(s3==s4){ 23 System.out.println("s3和s4是同一个实例"); 24 }else{ 25 System.out.println("s3和s4不是同一个实例"); 26 } 27 } 28 29 }