設計模式之單例模式Singleton pattern
單例模式Singleton pattern
一種軟件設計模式。在核心結構中只包含一個被稱為單例的特殊類。
一個類只有一個對象實例,並且自行實例化向整個系統提供。
動機
一個系統中可以存在多個打印任務,但是只能有一個正在工作的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或ID(序號)生成器。如在Windows中就只能打開一個任務管理器。如果不使用機制對窗口對象進行唯一化,將彈出多個窗口,如果這些窗口顯示的內容完全一致,則是重復對象,浪費內存資源;如果這些窗口顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符,也會給用戶帶來誤解,不知道哪一個才是真實的狀態。因此有時確保系統中某個對象的唯一性即一個類只能有一個實例非常重要。
如何保證一個類只有一個實例並且這個實例易於被訪問呢?定義一個全局變量可以確保對象隨時都可以被訪問,但不能防止我們實例化多個對象。一個更好的解決辦法是讓類自身負責保存它的唯一實例。這個類可以保證沒有其他實例被創建,並且它可以提供一個訪問該實例的方法。這就是單例模式的模式動機
單例模式三個要點:
某個類只有一個實例 ------單例模式的類只提供私有的構造函數
必須自行創建這個實例--------類定義中含有該類的靜態私有對象
必須自行向整個系統提供這個實例------該類提供了一個靜態的公有的函數用於創建或獲取它本身的靜態私有對象。
一些資源管理器會設計成單例模式
優點
實例控制 單例模式阻止其他對象實例化自己的單例對象的副本,從而確保所有的對象都訪問唯一實例
靈活 類控制實例化過程,可以靈活更改實例化過程
缺點
開銷 每次對象請求引用時都要檢查是否存在類的實例,需要開銷。----》可以通過使用靜態初始化解決此問題。
可能的開發混淆 使用單例對象(尤其在類庫中定義的對象)時,開發人員必須記住自己不能使用new關鍵字實例化對象。
對象生存期 不能解決刪除單個對象的問題。
實例
Java
Singleton模式主要作用是保證在java應用程序中,一個類Class只有一個實例存在。
三種形式
懶漢形式
餓漢式
雙重鎖的形式
雙重鎖模式將同步內容下放到if內部,提高了執行的效率,不必每次獲取對象時都進行同步,只有第一次才同步,創建了以後就沒必要了。
這種模式中雙重判斷加同步的方式,比第一個例子中的效率大大提升,因為如果單層if判斷,在服務器允許的情況下,
假設有一百個線程,耗費的時間為100*(同步判斷時間+if判斷時間),而如果雙重if判斷,100的線程可以同時if判斷,理論消耗的時間只有一個if判斷的時間。
所以如果面對高並發的情況,而且采用的是懶漢模式,最好的選擇就是雙重判斷加同步的方式
設計模式之單例模式Singleton pattern