一、什麼是單例模式
單例模式是一種物件建立型模式,使用單例模式,可以保證為乙個類只生成唯一的例項物件。也就是說,在整個程式空間中,該類只存在乙個例項物件。 其實,gof對單例模式的定義是:保證乙個類、只有乙個例項存在,同時提供能對該例項加以訪問的全域性訪問方法。
二、為什麼要使用單例模式呢?
在應用系統開發中,我們常常有以下需求:
- 在多個執行緒之間,比如servlet環境,共享同乙個資源或者操作同乙個物件
- 在整個程式空間使用全域性變數,共享資源
- 大規模系統中,為了效能的考慮,需要節省物件的建立時間等等。
因為singleton模式可以保證為乙個類只生成唯一的例項物件,所以這些情況,singleton模式就派上用場了。
三、單例模式的實現及其原理解析
1.餓漢式。
**:public class person
public void setname(string name)
//建構函式私有化
private person()
//提供乙個全域性的靜態方法
public static person getperson()
}main方法
public class mainclass
}原理解析:此種方式無論是單執行緒或者多執行緒都可以實現單例功能。原因是使用final修飾以後,jvm是把這種型別的變數作為全域性共享。所以一旦建立,所有的物件都可以查詢到,且因為final 修飾不可更改。
2.懶漢式。
**:public class person2
public void setname(string name)
//建構函式私有化
private person2()
//提供乙個全域性的靜態方法
public static person2 getperson()
return person;}}
main方法不變
解析:此種方法不能再多執行緒中使用,物件放到jvm的heap中,雖然heap是執行緒共享,但是如果執行緒數量過多,多個執行緒同時建立物件的話,就極有可能建立多個物件。此種問題也就涉及到執行緒的高併發問題。解決辦法見下。
3.雙重檢查。
此種方法為了解決懶漢式建立單例執行緒不安全問題。
public class person4
public void setname(string name)
//建構函式私有化
private person4()
//提供乙個全域性的靜態方法
public static person4 getperson() }}
return person;}}
解析:通過給**塊加鎖,保證只有乙個執行緒new 物件。同時sychinize時盡量保證給需要鎖的位置加鎖,避免不必要的阻斷,可以大大提高程式執行效率。
設計模式4 單例模式
保證乙個類僅有乙個例項,並提供乙個訪問他的全域性訪問點。所有類都有構造方法,假如不對他進行編碼,系統會生成空的public 的構造方法,外部類就能建立這個類的物件。為了不讓其他類能new出這個類的例項,所以需要寫乙個private 的構造方法 其實即使使用private修飾,通過反射機制還是能在外部...
設計模式 4 單例模式
單例模式屬於建立型的設計模式,其特點是在於保證乙個類只會被例項化一次,可以作為全域性唯一資源提供給系統。此處通過判斷兩個例項的位址是否一致來驗證單例模式,中包含了保證多執行緒安全的單例模式實現。由於python下的懶漢單例模式實現本人覺得是不可能的,因此下面使用了double check的方式實現了...
設計模式 4 單例模式
單例模式用來確保乙個類只有乙個例項,並提供乙個全域性訪問點。在所有的設計模式中,單例模式是最簡單也是最常用的一種設計模式,它只為乙個例項提供乙個全域性物件,內次嘗試去獲取乙個類的例項的時候,保證獲取到的都是這乙個物件。下面是關於單例模式中的一些小概念 餓漢式和懶漢式區別 餓漢就是類一旦載入,就把單例...