單例模式(singleton pattern): 用來建立獨一無二的,只能有乙個例項的物件的入場券。
作用:有些物件我們只需要乙個,比如:執行緒池、快取、對話方塊、處理偏好設定、登錄檔等物件,這些物件只能有乙個例項,如果製造出多個例項,就會導致很多問題產生,例如:程式行為異常、資源使用過量、或者是不一致的結果。
當我們建立乙個物件的時候,只需要new myobject()即可。假設有這麼乙個類,我們需要保證只能夠例項化它一次,那麼該如何實現呢?
可以這麼做:讓這個類含有乙個私有構造器,使得除本身之外的所有類都不能夠對其實例化。在myclass定義乙個私有構造器,乙個靜態方法getinstance(),使用myclass.getinstance()方法呼叫得到乙個例項物件。
public myclass
public static myclass getinstance()
}
乙個經典的單例模式實現(延遲例項化----懶漢式):
package com.designpattern;
public class singleton
//getinstance()方法例項化物件,並返回這個例項
public static synchronized singleton getinstance()
return uniqueinstance;}}
這樣就可以保證singleton物件是獨一無二的,利用單例模式建立而得。當前類沒有公開的構造器,因為它的構造器被宣告為私有的,別人不可能通過new產生多個物件,如何要取得例項,必須發起"請求"得到乙個例項,而不是自行例項化得到乙個例項。
該類有乙個靜態方法,叫做getinstance()。呼叫這個方法,該例項立刻現身,隨時可以工作。事實上,這個例項物件可能是在這次呼叫的時候被建立出來的,也可能是以前很早就被建立出來了。
何為懶漢式:當jvm載入這個類時並沒有立即建立此唯一的單件例項,而是在使用到的時候才建立。
用類圖表示:
另一種實現方式("急切"建立例項:餓漢式):
public class singleton
public static singleton getinstance()
}
利用這個做法,依賴jvm在載入這個類時馬上建立唯一的單件例項。jvm保證在任何執行緒訪問uniqueinstance靜態變數之前,一定先建立此例項。
單例模式----確保乙個類只有乙個例項,並提供乙個全域性訪問點。
獨一無二的單例模式
單例模式被定義為 確保乙個類只有乙個例項,並提供乙個全域性訪問點。單例模式使得乙個類只能有唯一的乙個例項,這意味著不能再使用new關鍵字建立物件,因為一旦可以被new,就可以被多次new。問題1 如何保證乙個類只有乙個例項?問題2 不能使用new如何獲取物件?這兩個問題的答案非常簡單 由於new物件...
單例模式製造獨一無二的物件
為什麼不用靜態全域性變數呢?如果將物件賦值給全域性變數,那麼你必須在程式一開始就建立物件,非常消耗資源。利用單例模式,就可以在需要的時候才建立物件。另外全域性變數可能指向多個物件,這違反了例項唯一性。單例模式確保乙個類有且僅有乙個例項,並提供乙個全域性變數。類圖如下 單例模式典型例子強調三點 1 定...
設計模式系列 搞懂單例模式,我獨一無二
單例模式的定義 乙個類只有乙個例項,且該類能自行建立這個例項,並提供乙個訪問該單例的全域性訪問點。屬於建造型模式。單例模式的實現 餓漢式單例 類載入的時候即初始化並建立單例物件。適用於單例物件較少的情況。public class hungrysingleton public static hungr...