單例模式(Singleton Pattern): 定義:Ensure a class has only instance , and provide a global point of access to it.(確保某一個(gè)類只有一個(gè)實(shí)例,而且自動(dòng)實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例)
優(yōu)點(diǎn):
1、在內(nèi)存中只有一個(gè)實(shí)例,所以減少了內(nèi)存開銷,特別是在一個(gè)對象需要頻繁地創(chuàng)建、銷毀時(shí),而且創(chuàng)建或銷毀時(shí)性能又無法優(yōu)化。單例模式的優(yōu)勢非常明顯;
2、避免對資源的多重占用。例如寫文件動(dòng)作,由于只有個(gè)實(shí)例存在內(nèi)存中,避免對同一個(gè)資源文件的同時(shí)寫操作
3、提供了對唯一實(shí)例的受控訪問。
4、允許可變數(shù)目的實(shí)例。
缺點(diǎn):
1、沒有接口,擴(kuò)展困難。
2、不適用于變化的對象,如果同一類型的對象總是要在不同的用例場景發(fā)生變化,單例就會引起數(shù)據(jù)的錯(cuò)誤,不能保存彼此的狀態(tài)。
3、濫用單例將帶來一些負(fù)面問題,如為了節(jié)省資源將數(shù)據(jù)庫連接池對象設(shè)計(jì)為的單例類,可能會導(dǎo)致共享連接池對象的程序過多而出現(xiàn)連接池溢出;如果實(shí)例化的對象長時(shí)間不被利用,系統(tǒng)會認(rèn)為是垃圾而被回收,這將導(dǎo)致對象狀態(tài)的丟失。
4、單例類的職責(zé)過重,在一定程度上違背了“單一職責(zé)原則”。
適用場景:
1、資源共享的情況下,避免由于資源操作時(shí)導(dǎo)致的性能或損耗等。如上述中的日志文件,應(yīng)用配置。
2、控制資源的情況下,方便資源之間的互相通信。如線程池等。
3、需要定義大量的靜態(tài)常量和靜態(tài)方法(如工具類)的環(huán)境,可以采用單例模式
UML圖:
單例模式的幾種書寫方式:
1.餓漢式單例:單例實(shí)例在類裝載時(shí)就構(gòu)建 ,
特點(diǎn):線程安全 在類加載的同時(shí)已經(jīng)創(chuàng)建好一個(gè)靜態(tài)對象,調(diào)用時(shí)反應(yīng)速度快
[AppleScript] 純文本查看 復(fù)制代碼
01 02 03 04 05 06 07 08 09 10 11 12 | public class SingletonPattern ( ) [ / font ][ / color] {
private static SingletonPattern singleton = new SingletonPattern ( ) ;
private SingletonPattern ( )
{
}
/ / 通過該方法獲得實(shí)例對象
public static SingletonPattern GetSingleton ( )
{
return singleton;
}
}
|
2、懶漢式單例:單例實(shí)例在第一次被使用時(shí)構(gòu)建,延遲初始化
特點(diǎn): 避免了餓漢式的那種在沒有用到的情況下創(chuàng)建事例,資源利用率高,不執(zhí)行g(shù)etInstance()就不會被實(shí)例,可以執(zhí)行該類的其他靜態(tài)方法。但是多個(gè)線程判斷instance都為null時(shí),在執(zhí)行new操作時(shí)多線程會出現(xiàn)重復(fù)情況
[AppleScript] 純文本查看 復(fù)制代碼
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | public class SingletonPattern ( )
{
private static SingletonPattern singleton = null;
private SingletonPattern ( )
{
}
/ / 通過該方法獲得實(shí)例對象
public static SingletonPattern GetSingleton ( )
{
if ( singleton = = null )
{
/ / 多個(gè)線程判斷instance都為null時(shí),在執(zhí)行 new 操作時(shí)多線程會出現(xiàn)重復(fù)情況
singleton = new SingletonPattern ( ) ;
}
return singleton;
}
}
|
3、雙重檢測單例:
特點(diǎn): 資源利用率高,不執(zhí)行g(shù)etInstance()就不被實(shí)例,可以執(zhí)行該類其他靜態(tài)方法 但是第一次加載時(shí)反應(yīng)不快
[AppleScript] 純文本查看 復(fù)制代碼
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class SingletonPattern ( )
{
private static SingletonPattern singleton = null;
private SingletonPattern ( )
{
}
/ / 通過該方法獲得實(shí)例對象
public static SingletonPattern GetSingleton ( )
{
if ( singleton = = null )
{
/ / 使用synchronized關(guān)鍵字,防止多個(gè)線程判斷instance都為null時(shí),在執(zhí)行 new 操作時(shí)多線程會出現(xiàn)重復(fù)情況
synchronized ( SingletonPattern. class ) {
if ( instance = = null ) {
instance = new SingletonPattern ( ) ;
}
}
}
return singleton;
}
}
|
4、靜態(tài)內(nèi)部類模式:
[AppleScript] 純文本查看 復(fù)制代碼
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | public class SingletonPattern ( )
{
private SingletonPattern ( )
{
}
private static class SingletonHelp ( )
{
static SingletonPattern singleton = new SingletonPattern ( ) ;
}
/ / 通過該方法獲得實(shí)例對象
public static SingletonPattern GetSingleton ( )
{
return singleton;
}
}
|
好了,這一章就寫到這,歡迎大家加入QQ群:280993838 。或者關(guān)注我的公眾號:
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。