首頁  >  文章  >  Java  >  什麼是java單例模式

什麼是java單例模式

王林
王林原創
2019-11-11 14:37:152585瀏覽

什麼是java單例模式

什麼是單例模式?

單例模式是保證類別的實例是單例的常見設計模式。

單例模式的優點:

(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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn