一,什麼是單例模式?
單例模式是一種物件建立型模式,使用單例模式,可以保證為乙個類只生成唯一的例項物件。也就是說,在整個程式空間中,該類只存在乙個例項物件。
其實,gof( gang of four,代表意思是 設計模式一書,四個作者,被稱為四人組)對單例模式的定義是: 保證乙個類,只有乙個例項存在,同事提供能對該例項加以訪問的全域性訪問方法。
二,為什麼要使用單例模式呢?
在開發中,我們常常有以下需求:
-在多個執行緒之間,比如servlet 環境,共享同乙個資源或者操作同乙個物件
-在整個程式中使用全域性變數,共享資源。
-在整個系統中,為了效能的考慮,需要節省物件的建立時間等等
singleton模式可以保證為了乙個類只生成唯一的例項物件。
三,單例模式實現。
3.1 餓漢式。
public class singleton
/*** 提供乙個全域性的靜態方法
* @return
*/public static singleton getsingleton()
}
3.2 懶漢式。
public class singletonlazy
/**懶漢模式,在不需要的時候並不會去建立例項,只有在真正呼叫的時候
* 提供給外部的靜態方法才去例項化
* @return
*/private static singletonlazy getinstance()
return singletonlazy;
}}
3.3 雙重檢查。
public class singletoncheck
/***
* 雙重檢查,在多執行緒的環境下,會出現資源競爭。
* 在 a執行緒剛進入 if 判斷的時候, b執行緒 就已經例項化了。這時候 我們需要加上 synchronized (同步),
* 這樣能保證 a執行緒執行完方法體,b執行緒 才能執行。
* synchronized 放在 if 裡面 是為了節省效能,在需要執行緒同步的地方去做執行緒同步。 第一重檢查
* 第二重檢查, 當 a,b執行緒先後進入if 判斷都是null時,都會去 肯定有乙個執行緒阻塞在 if判斷這裡,
* 只有當另乙個執行緒 去例項化完成之後, 另乙個執行緒 才會去 例項化,但是 之前已經有乙個例項化物件了,
* 現在又出現兩次例項化物件,肯定是不符合我們的初衷的,所以在 同步方法內 在做一次檢查,物件是否為空,
* 這就是雙重檢查
* @return
*/private static singletoncheck getinstance()}}
return singletoncheck;
}}
3.4靜態內部類單例模式。
public class singletonstatic
/*** 只有第一次呼叫getinstance方法時,虛擬機器才載入 inner 並初始化instance ,只有乙個執行緒可以獲得物件的初始化鎖,
* 其他執行緒無法進行初始化,保證物件的唯一性。目前此方式是所有單例模式中最推薦的模式,但具體還是根據專案選擇。
*/public static singletonstatic getinstance()
private static class inner
}
3.5列舉單例模式
public enum singletonenum
}
推薦:使用 3.4靜態內部類單例模式,直觀,簡潔,同樣是執行緒安全的 23種設計模式之單例模式
我們也經常遇到類似的情況,為了節約系統資源,有時需要確保系統中某個類只有唯一乙個例項,當這個唯一例項建立成功之後,我們無法再建立乙個同型別的其他物件,所有的操作都只能基於這個唯一例項。為了確保物件的唯一性,我們可以通過單例模式來實現,這就是單例模式的動機所在。定義 單例模式 singleton pa...
23種設計模式之 單例模式
保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。讓類自身負責儲存它的唯一例項,這個類可以保證沒有其他例項可以被建立,並且它可以提供乙個訪問 獲取 該例項的方法。單例類應滿足以下特點 單例類 singleton 自己例項化自己的唯一例項,並提供訪問該唯一例項的方法。public class s...
23種設計模式之單例模式
單例模式 確保乙個類最多只有乙個例項,並提供乙個全域性訪問點 普通單例模式示例 有問題 public class singleton public static singleton getinstance return uniqueinstance 示例singleton public class ...