單例模式(Singleton)應用場景和優缺點

單例(Singleton)模式 也叫單態模式

概述:單例(Singleton)模式要求一個類有且僅有一個實例,並且提供了一個全局的訪問點。這就提出了一個問題:如何繞過常規的構造器,提供一種機制來保證一個類只有一個實例?客戶程序在調用某一個類時,它是不會考慮這個類是否只能有一個實例等問題的,所以,這應該是類設計者的責任,而不是類使用者的責任。 從另一個角度來說,Singleton模式其實也是一種職責型模式。因爲我們創建了一個對象,這個對象扮演了獨一無二的角色,在這個單獨的對象實例中,它集中了它所屬類的所有權力,同時它也肩負了行使這種權力的職責!


核心作用:保證一個類只有一個實例,並且提供一個訪問該實例的全局訪問點


應該在什麼時候下使用單例模式?

  舉一個小例子,在我們的windows桌面上,我們打開了一個回收站,當我們試圖再次打開一個新的回收站時,Windows系統並不會爲你彈出一個新的回收站窗口。,也就是說在整個系統運行的過程中,系統只維護一個回收站的實例。這就是一個典型的單例模式運用。

  繼續說回收站,我們在實際使用中並不存在需要同時打開兩個回收站窗口的必要性。假如我每次創建回收站時都需要消耗大量的資源,而每個回收站之間資源是共享的,那麼在沒有必要多次重複創建該實例的情況下,創建了多個實例,這樣做就會給系統造成不必要的負擔,造成資源浪費。

  再舉一個例子,網站的計數器,一般也是採用單例模式實現,如果你存在多個計數器,每一個用戶的訪問都刷新計數器的值,這樣的話你的實計數的值是難以同步的。但是如果採用單例模式實現就不會存在這樣的問題,而且還可以避免線程安全問題。同樣多線程的線程池的設計一般也是採用單例模式,這是由於線程池需要方便對池中的線程進行控制

  同樣,對於一些應用程序的日誌應用,或者web開發中讀取配置文件都適合使用單例模式,如HttpApplication 就是單例的典型應用。

  從上述的例子中我們可以總結出適合使用單例模式的場景和優缺點: 

   適用場景: 1.需要生成唯一序列的環境

                       2.需要頻繁實例化然後銷燬的對象。

                       3.創建對象時耗時過多或者耗資源過多,但又經常用到的對象。

                       4.方便資源相互通信的環境


   優點:1.實現了對唯一實例訪問的可控

               2.對於一些需要頻繁創建和銷燬的對象來說可以提高系統的性能。

   缺點:1. 不適用於變化頻繁的對象
               2.濫用單例將帶來一些負面問題,如爲了節省資源將數據庫連接池對象設計爲的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出。

               3.如果實例化的對象長時間不被利用,系統會認爲該對象是垃圾而被回收,這可能會導致對象狀態的丟失。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章