1. 程式人生 > >輕鬆理解-中高階java開發必知必會之 遇見最好的單例模式

輕鬆理解-中高階java開發必知必會之 遇見最好的單例模式

什麼是單例模式?

單例模式確保某個類只有一個例項,而且自行例項化並向整個系統提供這個例項。

很多教程裡都寫不好的寫法和好的寫法這裡我只介紹好的寫法;

使用語法糖是最好的寫法,站在巨人的肩膀上會減少很多問題

一、我們使用java的類級內部類和靜態初始化來保證單利模式的可行性:

上面的註釋非常的清楚,主要的實現思想就是

1.類級的內部類,也就是靜態的成員式內部類,該內部類的例項與外部類的例項沒有繫結關係,而且只有被呼叫到時才會裝載,從而實現了延遲載入。

2.靜態初始化器,由JVM來保證執行緒安全

* 如果你選擇自己實現我想最好的辦法也只能加上 synchronized 互斥鎖在類上但是這樣當呼叫量較大的時候肯定會影響程式的效能,所以使用java帶來的一些語法糖是更佳的選擇;

二、使用列舉類

單例的列舉實現在《Effective Java》中有提到,因為其功能完整、使用簡潔、無償地提供了序列化機制、在面對複雜的序列化或者反射攻擊時仍然可以絕對防止多次例項化等優點,單元素的列舉型別被作者認為是實現Singleton的最佳方法。

列舉類天生自帶主角光環,在Java規範中規定,每一個列舉型別極其定義的列舉變數在JVM中都是唯一的,因此在列舉型別的序列化和反序列化上,Java做了特殊的規定。

下面我們用一個列舉實現單個數據源例子來簡單驗證一下:

宣告一個列舉,舉例用於獲取資料庫連線:

模擬一個數據庫連線類:

兩次的輸出結果都為true,表明兩次獲取返回了相同的例項,但是這個結果不具備說服力,因為這個沒有在多執行緒的環境下測試,有興趣的小夥伴可以自行測試下,也可以測試在多此呼叫下兩種方式有沒有什麼效能上的差異,可以給我留言。