什麼是單例模式?
單例模式是保證類別的實例是單例的常見設計模式。
單例模式的優點:
(1)首先肯定是節省記憶體資源,不管多頻繁的透過暴露的方法建立實例,都能保證創建的物件在系統記憶體中是同一實例物件;
(2)靈活性,由於所有實例的建立都由該類別控制,所有該類別可以靈活的變更實例化過程;
# (3)實例的受控存取,單例類別可以輕鬆的控制唯一實例的受控存取;
單例模式的缺點:
(1)單例模式沒有接口,不容易擴充;
(2)使用時不能用反射模式建立單例,否則會實例化一個新的物件;
(3)使用懶單範例模式時注意執行緒安全性問題;
實作單例模式的方式:
餓單例方式
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單例模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!