了解23種設計模式之單例模式

2021-10-06 08:44:14 字數 1889 閱讀 5286

一,什麼是單例模式?

單例模式是一種物件建立型模式,使用單例模式,可以保證為乙個類只生成唯一的例項物件。也就是說,在整個程式空間中,該類只存在乙個例項物件。

其實,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 ...