1. 程式人生 > >java單例和多例

java單例和多例

單個 static 改變 cpu lazy pack out ont 通過

背景:最近在學習韓老師的筆記時候發現不是很了解單例和多例,於是通過網上查找資料的方式去學習。

設計模式:最佳的實踐,是軟件開發人員在軟件開發過程中面臨一般解決方案,也就是開發的經驗總結。

單例模式(Singleton):是 Java 中最簡單的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。

這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

單例類的特點:

  • 單例類只能有一個實例。
  • 單例類必須自己創建自己的唯一實例。
  • 單例類必須給所有其他對象提供這一實例。
  • 單例類的構造方法私有。(避免外部利用構造方法直接創建多個實例

多例模式(Multiton):作為對象的創建模式,多例模式中的多例類可以有多個實例,而且多例類必須自己創建、管理自己的實例,並向外界提供自己的實例。

多例類的特點

  • 多例類可有多個實例。
  • 多例類必須自己創建,管理自己的實例,並向外提供自己的實例。
  • 根據是否有實例上限分為有上限的多例類和無上限的多例類。

多例的單例模式的比較:

  • 單例模式和多例模式屬於對象模式。
  • 它們都不對外提供構造方法,即構造方法都為私有。
  • 單例模式的對象在整個系統中只有一份,多例模式可以有多個實例。
  • 單例和多例模式結構圖技術分享圖片
  • 單例是所有的請求都用一個對象來處理,比如service和dao層的對象通常都是單例的,而多例是每個請求用一個新的對象來處理,比如action;
  • 單例可以節約CPU和內存,多例可以防止並發問題,即一個請求改變了對象的狀態,此時對象處理另一個請求,而之前的請求對象狀態的改變導致對象對另一個請求的錯誤處理,對象中含有可改變的狀態時,則用多例反之單例。

單例的實現:

創建一個 SingleObject 類。SingleObject 類有它的私有構造函數和本身的一個靜態實例。SingleObject 類提供了一個靜態方法,供外界獲取它的靜態實例。

package ecut.enums;

public class SingleObject {

    // 創建 SingleObject 的一個對象
    private static
SingleObject instance = new SingleObject(); // 讓構造函數為 private,這樣該類就不會被實例化 private SingleObject() { } // 獲取唯一可用的對象 public static SingleObject getInstance() { return instance; } public void showMessage() { System.out.println("Hello World!"); } }

在SingletonPatternDemo中使用 SingleObject 類來獲取 SingleObject唯一 對象。

package ecut.enums;

public class SingletonPatternDemo {
    public static void main(String[] args) {

        // 不合法的構造函數
        // 編譯時錯誤:構造函數 SingleObject() 是不可見的
        // SingleObject object = new SingleObject();

        // 獲取唯一可用的對象
        SingleObject object = SingleObject.getInstance();

        // 顯示消息
        object.showMessage();
    }
}

運行結果如下:

Hello World!

單例的幾種實現方法:

1、懶漢,線程不安全

lazy初始化(懶加載,在需要的時候才創建單例對象,而不是隨著軟件系統的運行或者當類被加載器加載的時候就創建

java單例和多例