設計模式學習 單例模式

2022-09-09 22:45:39 字數 2049 閱讀 1005

一、介紹

單例模式(singleton pattern)是 j**a 中最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。

二、單例模式幾種實現

1)餓漢式(推薦)

餓漢式是最簡單的單例實現形式,並且具備執行緒安全特性(由classloader機制保障線程安全),唯一的不足就是不管程式中有沒有用到此物件都會被載入進記憶體,當然個人認為這個缺點影響不大,畢竟如果你都壓根不用此物件了那幹嘛還要載入呢。

public

class

demomanager

public

static

demomanager getinstance()

}

2)懶漢式

懶漢式顧名思義只有在需要的時候載入,懶漢式也有幾種寫法:

執行緒不安全版本(不推薦)

public

class

demomanager

public

static

demomanager getinstance()

return

demomanager;

}}

執行緒安全版本(不推薦)

public

class

demomanager

public

static

synchronized

demomanager getinstance()

return

demomanager;

}}

雖然此版本通過加鎖保障了執行緒安全,但是我們知道加鎖是比較消耗資源的操作,在高併發場景下會存在效能問題,因此此版本也不推薦。

3)雙重檢測版本

此版本可以看作是懶漢式的增強版,既實現懶載入又能保障線程安全且擁有不錯的效能,這種方式本質上就是減少不必要的加鎖操作。

public

class

demomanager

public

static

synchronized

demomanager getinstance() }}

return

demomanager;

}}

這個版本的缺點就是比較複雜,那麼有沒有既簡單又完美的實現方式呢?

4)靜態內部類式(推薦)

這種方式同樣利用了 classloader 機制來保證初始化 instance 時只有乙個執行緒,它餓漢式不同的是:餓漢式只要 demomanager 類被裝載了,那麼 instance 就會被例項化(沒有達到懶載入效果),而這種方式是 demomanager 類被裝載了,instance 不一定被初始化。因為 innermanager 類沒有被主動使用,只有通過顯式呼叫 getinstance 方法時,才會顯式裝載 innermanager 類,從而例項化 instance。

public

class

demomanager

private

demomanager()

public

static

synchronized

demomanager getinstance()

}

5)列舉(推薦)

這種實現方式還沒有被廣泛採用,但這是實現單例模式的最佳方法。它更簡潔,自動支援序列化機制,絕對防止多次例項化。它不僅能避免多執行緒同步問題,而且還自動支援序列化機制,防止反序列化重新建立新的物件,絕對防止多次例項化。

public

enum

demomanager

}

三、總結

以上就是單例模式的幾種寫法,個人認為一般情況下餓漢式就能滿足我們的需求,除非在某下場景下明確規定需要懶載入那我們在用靜態內部類或者列舉形式,

學習設計模式 單例模式

適用於 優點 缺點 1.懶漢式 public class singleton public static synchronized singleton getinstance return uniqueinstance 2.餓漢式 public class singleton public stat...

設計模式學習 單例模式

單例模式是一種常用的軟體設計模式。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。1.單例模式特點 2.單例模式作用 3.單例模式種類 a.餓漢式 b.懶漢式 c.懶漢式 ...

學習設計模式( ) 單例模式

定義 確保乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。型別 建立類模式 單例模式應該是23種設計模式中最簡單的一種模式了。它有以下幾個要素 單例模式現在主流推薦第一種雙重檢查型。以前流行的有根據例項化物件時機的不同有分為兩種 一種是餓漢式單例,一種是懶漢式單例。餓漢式單例在單例類被載...