有時候某些物件我們只需要乙個,如:執行緒池、快取、對話方塊等等,對於這類物件我們只能有乙個例項,如果我
們製造出多個例項,就會導致很多問題產生。
但是我們怎樣才能保證乙個類只有乙個例項並且能夠便於訪問?這裡我們想到了全域性變數,全域性變數確實是可以
保證該類可以隨時訪問,但是它很難解決只有乙個例項問題。最好的辦法就是讓該自身來負責儲存它的唯一例項。這
個類必須要保證沒有其他類來建立它。這裡我們可以將其構造方法私有化。即
public myclass含有私有化構造器的類就能保證它不能被其他類例項化了。但是我們如何來獲取這個例項化類呢?提供乙個方法}
用於返回該類的例項物件即可實現。
public class myclass一、基本定義通過上面簡單介紹,我們可以對單例模式有乙個簡單的認識。所謂單例模式就是確保某乙個類只有乙個例項,並public static myclass getinstance()
}
且提供乙個全域性訪問點。
從上面可以看出單例模式有如下幾個特點:
一、它只有乙個例項。
二、它必須要自行例項化。
三、它必須自行想整個系統提供訪問點。
二、模式結構
單例模式可以說是最簡單的設計模式了,它僅有乙個角色singleton。
singleton:單例。
三、模式實現
public class singleton在《head first》有這樣乙個場景,就是說有兩個執行緒都要執行這段**,很有可能會產生兩個例項物件。如下圖:public static singleton getinstance()
return uniqueinstance; }
}
這裡有三種解決方案。
第一、 使用synchronized來處理。也就是說將getinstance()方法變成同步方法即可。
public class singleton第二、 直接初始化靜態變數。這樣就保證了執行緒安全。public static synchronized singleton getinstance()
return uniqueinstance; }
}
public class singleton第三、 用「雙重檢查加鎖」,在getinstance()中減少使用同步。public static singleton getinstance()
}
public class singleton在這裡是首先檢查是否例項已經建立了,如果尚未建立,才會進行同步。這樣一來。只有第一次會同步。/**
* 檢查例項,如果不存在,就進入同步區域
*/public static singleton getinstance()
}}
return uniqueinstance; }
}
四、模式優缺點
優點
一、節約了系統資源。由於系統中只存在乙個例項物件,對與一些需要頻繁建立和銷毀物件的系統而言,單
例模式無疑節約了系統資源和提高了系統的效能。
二、因為單例類封裝了它的唯一例項,所以它可以嚴格控制客戶怎樣以及何時訪問它。
缺點
一、由於單例模式中沒有抽象層,因此單例類的擴充套件有很大的困難。
二、單例類的職責過重,在一定程度上違背了「單一職責原則」。
五、模式使用場景
下列幾種情況可以使用單例模式。
一、系統只需要乙個例項物件,如系統要求提供乙個唯一的序列號生成器,或者需要考慮資源消耗太大而只允許建立乙個物件。
二、客戶呼叫類的單個例項只允許使用乙個公共訪問點,除了該公共訪問點,不能通過其他途徑訪問該例項。
六、總結
1. 單例模式中確保程式中乙個類最多只有乙個例項。
2. 單例模式的構造器是私有了,而且它必須要提供例項的全域性訪問點。
3. 單例模式可能會因為多執行緒的問題而帶來安全隱患。
設計模式讀書筆記 單例模式
有時候某些物件我們只需要乙個,如 執行緒池 快取 對話方塊等等,對於這類物件我們只能有乙個例項,如果我 們製造出多個例項,就會導致很多問題產生。但是我們怎樣才能保證乙個類只有乙個例項並且能夠便於訪問?這裡我們想到了全域性變數,全域性變數確實是可以 保證該類可以隨時訪問,但是它很難解決只有乙個例項問題...
讀書筆記 設計模式(二) 單例模式
確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。確保某個類有且只有乙個物件的場景,避免產生多個物件消耗過多的資源,或者某種型別的物件只應該有且只有乙個。1 懶漢模式public class people public static synchronized people getin...
大話設計模式 讀書筆記2單例模式
這裡需要例項化但不使用new方式,可以在構造方法前面新增private,私有化構造方法。使用背景 所有類都有構造方法,不單獨編寫構造方法則系統預設使用空構造,單獨編寫構造方法的話,預設的構造器就會失效 然後需要單獨建立乙個公共方法來專門返回乙個類例項。在該方法中需要對是否例項化有乙個判斷,若沒有例項...