什麼是單例模式?
單例模式是保證類的實例是單例的一種常見設計模式。
單例模式的優勢:
(1)首先確定是節省內存資源,無論多頻繁的經過暴露的方法建立實例,都能保證建立的對象在系統內存中是同一實例對象;
(2)靈活性,因爲全部實例的建立都由該類控制,全部該類能夠靈活的更改實例化過程;
(3)實例的受控訪問,單例類能夠輕鬆的控制惟一實例的受控訪問;
單例模式的缺點:
(1)單例模式沒有接口,不容易擴展;
(2)使用時不能用反射模式建立單例,不然會實例化一個新的對象;
(3)使用懶單例模式時注意線程安全問題;
實現單例模式的方式:
餓單例方式java
package index; public class Superman { //空的構造器 private Superman(){} //實例化對象 private static Superman supermanInstance = new Superman(); //獲取實例化對象的靜態函數getSupermanInstance() public static Superman getSupermanInstance(){ return supermanInstance; } }
餓單例在類加載的時候就被提早new了出來,一開始就實例化了一個supermanInstance對象,無論你程序須要不要調用這個對象,它都已經準備好了;沒有進行延遲加載,爲了減少程序負載大多數狀況下須要懶加載,因此這種實現單例的方式不是最佳選擇。
懶單例方式(單線程寫法)小程序
package index; public class Superman { //空的構造器 private Superman(){} //實例化對象;只聲明 不使用new進行實例化 private static Superman supermanInstance = null; //獲取實例化對象的靜態函數getSupermanInstance() public static Superman getSupermanInstance(){ if(supermanInstance==null){ //若是爲null的狀況再進行實例化 supermanInstance = new Superman(); } return supermanInstance; } }
聲明一個對象不去實例化它,當程序須要實例化的時候調用靜態工廠方法 getSupermanInstance(),方法中對聲明的對象進行判斷,若是是null的話再去實例化它,這種寫法能夠達到延遲加載的效果,但它是非線程安全的,若在多線程中有兩個線程同時調用靜態工廠方法getSupermanInstance() 就有可能重複的建立該類的實例破壞了單例的惟一性;
以上就是什麼是java單例模式的詳細內容,但願對你有所幫助。
閱讀原文:什麼是java單例模式設計模式