單例模式是一種設計模式,這一種設計模式的目的是使得該類在整個JVM系統中只有唯一的一個實例對象,在就java開發過程中,很多場景下會碰到這種需求,所以單例模式也是最常用的設計模式之一,下麵從以下幾個方面對單例模式進行解說。 一、單例模式的概念: 需要設計一個類,達到的效果:在類的整個應用中指存在一個 ...
單例模式是一種設計模式,這一種設計模式的目的是使得該類在整個JVM系統中只有唯一的一個實例對象,在就java開發過程中,很多場景下會碰到這種需求,所以單例模式也是最常用的設計模式之一,下麵從以下幾個方面對單例模式進行解說。
一、單例模式的概念:
需要設計一個類,達到的效果:在類的整個應用中指存在一個對象,如果把這個類當做是數據類型,把對象當做該類的一個具體的值時,也就意味著這個數據類型只有一個值
二、單例模式的特點
①這個類有且只有一個實例
②這個類必須自己創建這個實例對象
③這個類必須向外部提供它的這一個實例對象。
三、單例模式的設計思路:
構造器私有化 靜態欄位指向該類實例 靜態方法返回該類實例
①構造器私有化,這樣外部就不能通過該類的構造方法創建該類對象
②靜態欄位指向該類實例,同時要將這個欄位私有化,這樣外部就不能隨意修改這個欄位值,設置為靜態外部才能通過該類類名可以取到這個對象
③靜態方法返回該類實例,一般在方法命名為getInstance(),這個方法是供外部使用的,所以要設置成public修飾的,同樣需要設置成static類級別的,因為要讓外部通過類名調用該方法
四、單例模式的幾種實現方式:
(1)餓漢模式
在類載入的時候就創建好那個實例對象,不管需不需要那個實例對象都會創建對象,導致載入的時候會比較慢
代碼如下:
//餓漢模式 class Singleton{ //1.構造方法私有化 private Singleton(){ } //2.提供一個該類實例的欄位並且私有化該欄位, private static Singleton instance = new Singleton(); //3.提供一個靜態方法供外部使用獲取到該類實例 public static Singleton getInstance(){ return instance; } }
(2)靜態代碼塊
在餓漢模式的基礎上的加強,通過靜態代碼塊來初始化實例對象,這個實例對象也是在類載入的時候創建的
代碼如下:
//靜態代碼塊 class Singleton{ //1.構造方法私有化 private Singleton(){ } //2.提供一個該類實例的欄位並且私有化該欄位, private static Singleton instance; //3.通過靜態代碼塊初始化欄位值 static{ instance = new Singleton(); } //4.提供一個靜態方法供外部使用獲取到該類實例 public static Singleton getInstance(){ return instance; } }
(3)懶漢模式
在需要使用到這個實例對象的時候再去創建這個對象,但可能引起線程安全問題,同步synchronized同步代碼塊解決線程安全問題
代碼如下:
class Singleton{ //1.構造方法私有化 private Singleton(){ } //2.提供一個該類實例的欄位並且私有化該欄位, private static Singleton instance; //3.提供一個靜態方法供外部使用獲取到該類實例 public static Singleton getInstance(){ synchronized (Singleton.class) { if(instance == null) instance = new Singleton(); } return instance; } }
(4)枚舉【推薦使用】
枚舉:枚舉是一個類型只有固定的幾個值,當我們將枚舉的值設置成一個,那就是單例模式
public class Test{ //使用枚舉,直接使用類名 Singleton instance = Singleton.INSTANCE; } enum Singleton { INSTANCE; }