核心作用:保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。
常見的應用場景:
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.單例模式可以在系統設定...