單例類別將一個類別的物件建立限制為在java虛擬機器中只能建立一個。它還有助於提供物件的全域存取點。這種設計模式常用於快取、抽象工廠、日誌、Prototype等,也用於java.awt.Desktop、java.lang.Runtime等核心java類別。在java.lang.Runtime中,Java提供了一個Runtime類,表示應用程式目前正在執行的執行時間環境。這有助於連接應用程式和運行時環境。應該有一個對象,因為 JRE 是唯一的。在 java.awt.Desktop 中,Desktop 類別允許應用程式使用使用者的預設瀏覽器、郵件用戶端等啟動 URI 或檔案。同樣,該類別必須只有一個實例。
單例類別可以透過兩種方式建立。
開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
現在讓我們來看看Singleton類別的類別UML(統一建模語言)圖。
在類別UML圖中,第一個分區代表類別的名稱,第二個分區代表屬性,第三個分區代表方法。另外,+表示公共屬性或方法,-表示私有屬性或方法。例如,在我們的 Singleton 類別 UML 圖中,類別名為 Singleton,並且它有一個 main 方法。 main 方法、 getInstance 方法和sampleMethod 是上圖唯一公開的方法。作為我們實作的一部分,建構函數和實例屬性被設定為私有。這個公用 Main 方法請求實例,然後 getInstance 將其傳回給 main 方法。
基於實例化,普通Java類別和Singleton類別之間的唯一差異是我們將在Java類別中使用建構函數,而在Singleton中我們將使用getInstance()方法。
Singleton的設計模式有兩種形式。
1。惰性實例化
在延遲實例化中,類別實例在需要時建立。它是在 Synchronized 方法或區塊中建立的,以避免多執行緒環境中可能發生的競爭條件。
2。早期實例化
在早期實例化中,實例是在載入時建立的。儘管這是最簡單的方法,但它有一個缺點,即實例建立與是否存取無關。
下一節將解釋延遲實例化和早期實例化的範例。
如上所述,單例類別可以在早期實例化或延遲實例化中建立。
以下是實現延遲實例化的步驟。
1.將建構函式設定為私有。
例如,我們正在建立一個類別 LazyClass。構造函數如下所示。
private LazyClass () { }
2.為建立的類別建立一個私人靜態實例。
private static LazyClass instance;
3.建立一個靜態同步方法來取得已建立的類別實例。
public static synchronized LazyClass getInstance() { }
4.在 getInstance() 方法中,先檢查是否有任何實例。如果沒有找到,則建立一個。否則回傳實例。
if(instance == null) { instance = new LazyClass (); } return instance;
現在,讓我們使用範例程式碼來研究它。
//Java Program for Lazy Instantiation public class LazyClass { private static LazyClass instance; //set the constructor as private private LazyClass () {} //Checks whether an instance is already in the getInstance method public static synchronized LazyClass getInstance() { //if instance is not present already, create a new one if(instance == null) { instance = new LazyClass (); } // if an instance is present, then return it return instance; } //Sample method that is protected from more than one object creation public void sampleMethod( ) { System.out.println("sampleMethod for lazy singleton"); } public static void main(String[] args) { LazyClass temp=LazyClass.getInstance(); temp.sampleMethod(); } }
輸出:
這裡,不是在載入時建立實例,而是在同步區塊內建立實例。為了更好地理解,還給出了一個範例方法,它可以防止多個物件創建。
現在讓我們來看看早期實例化的步驟。它與延遲實例化類似,只是它不使用任何同步方法或區塊。
1.將建構函式設定為私有。
例如,我們正在建立一個類,EarlyClass。構造函數如下所示。
private EarlyClass () () { }
2.為建立的類別建立一個私人靜態實例。
private static EarlyClass <em>ins</em>= new EarlyClass();
3.建立一個靜態方法來取得建立的類別實例。
public static EarlyClass getInstance() { }
以下是早期實例化的範例程式碼。
//Java Program for Early Instantiation public class EarlyClass { //Create an instance of the class at load time private static EarlyClass <em>ins</em>= new EarlyClass(); //set the constructor as private private EarlyClass () {} //A static method to get the instance public static EarlyClass getInstance() { return ins; } //A sample method that is protected from more than one object creation public void sampleMethod() { System.out.println("sampleMethod for Early singleton"); } //Main method public static void main(String[] args) { EarlyClass tmp = getInstance(); tmp.sampleMethod(); } }
輸出:
在上面的程式中,在載入時建立了一個實例,並使用 getInstance() 方法傳回它。此外,作為單例實例化的一部分,建構函數被設定為私有。
節省記憶體是使用它的主要優點,因為物件可以被重複使用,而不是一次又一次地建立。
在本文檔中,我們透過類別 UML 圖、演算法和範例程式碼介紹了單例類別如何運作。當我們只需要一個類別的一個物件和該物件的全域存取點時,可以使用單例類別。可以根據需要使用早期實例化和延遲實例化兩種形式。
以上是Java 中的單例類的詳細內容。更多資訊請關注PHP中文網其他相關文章!