GOF23 單例模式(1)

2022-09-01 03:21:12 字數 1930 閱讀 9462

核心作用:保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。

常見的應用場景:

1.windows的task manager(任務管理器)

2.windows的recycle bin(**站)

3.專案中,讀取配置檔案的類,一般也只有乙個物件,沒有必要每次使用配置檔案資料,每次new乙個物件去讀取。

4.**的計數器,也是採用單例模式,這樣可以實現同步

5.應用程式的日誌應用,一般都採用單例模式進行實現,因為共享的日誌檔案一直處於開啟狀態,因為只能有乙個例項去操作,否則內容不好追加。

6.資料庫連線池的設計也是採用單例設計模式,因為資料庫連線是一種資料庫資源。

7.作業系統的檔案系統,乙個作業系統只能有乙個檔案系統。

9.在spring中,每個bean預設是單例的,這樣做的優點就是spring容器可以管理。

10.在servlet,每個servlet也是單例。

11.在spring mvc/struts1框架中,控制器物件也是單例

單例模式的優點:

—由於單例模式只生成乙個例項,減少了系統效能開銷,當乙個物件的產生需要比較多的資源時,如讀取配置,產生其他依賴物件時,則可以通過

在啟動應用程式時直接產生乙個單例物件,然後永久駐留記憶體的方式來解決。

—單例模式可以在系統設定全域性的訪問點,優化共享資源訪問,例如可以設計乙個單例類,負責所有資料表的對映處理。

常見的五種單例模式實現方式:

—主要:

1.惡漢式(執行緒安全,呼叫效率高。但是不可以延時載入)

2.懶漢式(執行緒安全,呼叫效率不高,但是可以延時載入)

—其他:

3.雙重檢測鎖式(由於jvm底層內部模型原因,偶爾會出問題,不建議使用)

4.靜態內部類式(執行緒安全,呼叫效率高,可以延時載入)

5.列舉單例(執行緒安全,呼叫效率高,不能延時載入)

惡漢式詳細例子:

這樣做是立即載入,如果我們這個類不需要instance物件,並且instance物件new的過程時間過長,這樣造成了資源浪費。

懶漢式單例模式的例子:

要點:lazy load(懶載入) 延遲載入,用到的時候才會去載入。

問題:資源利用率提高了,但是每一次呼叫getinstance()方法都要同步,併發效率低。

雙重檢測鎖單例模式例子:

優點:提高了執行效率不用每次都同步,只有第一次才同步,建立之後不需要同步。

問題:由於編譯器優化和jvm底層內部模型原因,偶爾會出問題,所以不建議使用。

靜態內部類單例設計模式(本質也是一種懶載入)

示例如下:

要點:—外部類沒有static屬性,所以不會像惡漢式那樣立即載入物件。

—只有真正呼叫getinstance()才會載入內部類,載入類時,執行緒是安全的。instance是static final型別,保證了記憶體中只有乙個這樣的

例項存在,而且只被賦值一次,保證了執行緒的安全性。

—兼備了併發高效呼叫和延時載入的優勢。

列舉單例模式例子:

優點:—實現簡單

—列舉本身就是單例模式,由jvm從根本上提供保障,避免通過反射和反序列化的漏洞。

缺點:—無法延時載入

GOF23之單例模式

單例模式是gof23中最簡單的模式。單例的設計模式裡的出場率很高,它簡單但也有多種實現方式,也正是因為它的靈活性和重要性使喚其多次出現在面試筆試中,經常與工廠模式搭配使用。作用 保證乙個類只能有乙個例項。多次建立只會返回同乙個例項。作用範圍 如word中的工具箱,任何時候只能有乙個工具箱。大話設計模...

GoF23 單例(Singleton)模式

目標之一 提高程式的可復用性 有哪些功能可以被擴充套件?擴充套件功能時必須修改哪些地方?有哪些類不需要修改?保證在jvm中只有乙個例項。需要該物件時,new例項物件。不安全 class singleton 當需要時才例項化,之後都是乙個例項。懶漢式不安全,所以需要加上同步。return public...

GOF23設計模式(單例模式)

保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。單例模式的優點 1.由於單例模式只生成乙個例項,減少了系統效能開銷,當乙個物件的產生需要比較多的資源時,如讀取配置 產生其他依賴物件時,則可以通過在應用啟動時直接產生乙個單例物件,然後永久駐留記憶體的方式來解決 2.單例模式可以在系統設定...