Java设计模式(01--单例模式)

概念:设计模式是一套被反复使用,多数人知晓的、经过分类编目的、代码设计经验的总结。

目的:使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性。

单例模式的使用场景:
很多时候有些对象我们只需要一个,如配置文件,工具类、线程池、缓存、日志等。
如果创造出多个实例就会导致很多问题,如占用过多资源,不一致的结果等。

单例模式作用:可以保证整个应用中某个实例有且只有一个。

“饿汉”模式与“懒汉”模式的区别
“饿汉”模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全。
“懒汉”模式的特点是加载类时比较快,但运行时获取对象的速度比较慢(第一次调用获取类实例的方法时,应用中不存在类实例,需要创建),其线程是不安全的。

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 }
原文地址:https://www.cnblogs.com/zplogo/p/6344181.html