首頁  >  文章  >  Java  >  Java 中的單例類

Java 中的單例類

PHPz
PHPz原創
2024-08-30 16:00:03851瀏覽

單例類別將一個類別的物件建立限制為在java虛擬機器中只能建立一個。它還有助於提供物件的全域存取點。這種設計模式常用於快取、抽象工廠、日誌、Prototype等,也用於java.awt.Desktop、java.lang.Runtime等核心java類別。在java.lang.Runtime中,Java提供了一個Runtime類,表示應用程式目前正在執行的執行時間環境。這有助於連接應用程式和運行時環境。應該有一個對象,因為 JRE 是唯一的。在 java.awt.Desktop 中,Desktop 類別允許應用程式使用使用者的預設瀏覽器、郵件用戶端等啟動 URI 或檔案。同樣,該類別必須只有一個實例。

單例類別在 Java 中如何運作?

單例類別可以透過兩種方式建立。

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

  1. 將建構函式設定為私有,以限制物件的建立。
  2. 建立一個靜態方法來取得物件的實例,以便您可以僅在類別內部處理物件的建立。

現在讓我們來看看Singleton類別的類別UML(統一建模語言)圖。

Java 中的單例類

在類別UML圖中,第一個分區代表類別的名稱,第二個分區代表屬性,第三個分區代表方法。另外,+表示公共屬性或方法,-表示私有屬性或方法。例如,在我們的 Singleton 類別 UML 圖中,類別名為 Singleton,並且它有一個 main 方法。 main 方法、 getInstance 方法和sampleMethod 是上圖唯一公開的方法。作為我們實作的一部分,建構函數和實例屬性被設定為私有。這個公用 Main 方法請求實例,然後 getInstance 將其傳回給 main 方法。

基於實例化,普通Java類別和Singleton類別之間的唯一差異是我們將在Java類別中使用建構函數,而在Singleton中我們將使用getInstance()方法。

Singleton的設計模式有兩種形式。

  • 延遲實例化: 需要時建立實例
  • 早期實例化: 在載入時建立實例。

1。惰性實例化

在延遲實例化中,類別實例在需要時建立。它是在 Synchronized 方法或區塊中建立的,以避免多執行緒環境中可能發生的競爭條件。

2。早期實例化

在早期實例化中,實例是在載入時建立的。儘管這是最簡單的方法,但它有一個缺點,即實例建立與是否存取無關。

下一節將解釋延遲實例化和早期實例化的範例。

Java中Singleton類別的實作

如上所述,單例類別可以在早期實例化或延遲實例化中建立。

延遲實例化

以下是實現延遲實例化的步驟。

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();
}
}

輸出:

Java 中的單例類

這裡,不是在載入時建立實例,而是在同步區塊內建立實例。為了更好地理解,還給出了一個範例方法,它可以防止多個物件創建。

早期實例化

現在讓我們來看看早期實例化的步驟。它與延遲實例化類似,只是它不使用任何同步方法或區塊。

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();
}
}

輸出:

Java 中的單例類

在上面的程式中,在載入時建立了一個實例,並使用 getInstance() 方法傳回它。此外,作為單例實例化的一部分,建構函數被設定為私有。

節省記憶體是使用它的主要優點,因為物件可以被重複使用,而不是一次又一次地建立。

結論

在本文檔中,我們透過類別 UML 圖、演算法和範例程式碼介紹了單例類別如何運作。當我們只需要一個類別的一個物件和該物件的全域存取點時,可以使用單例類別。可以根據需要使用早期實例化和延遲實例化兩種形式。

以上是Java 中的單例類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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