- 單例模式的五種實(shí)現(xiàn)方式
- 發(fā)布時(shí)間:2016/1/11 來(lái)源:搜數(shù)網(wǎng)絡(luò) 瀏覽:25
單例模式可以說(shuō)是23中設(shè)計(jì)模式中應(yīng)用最廣的一種模式了。
定義:確保某一個(gè)類只有一個(gè)實(shí)例,自行實(shí)例化并且想整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
使用場(chǎng)景:避免某個(gè)類產(chǎn)生多個(gè)對(duì)象而消耗過(guò)多的資源,確保某個(gè)類在程序中只有一個(gè)實(shí)例。比如我們使用的圖片加載器ImageLoader。往往單例創(chuàng)建的對(duì)象,耗費(fèi)的資源都比較多,所以在初始化單例對(duì)象的時(shí)候就顯得尤為重要了,接下來(lái),我們就來(lái)聊一聊單例的幾種實(shí)現(xiàn)方式。
一、餓漢式
- public class ImageLoader{
- private static ImageLoader instance = new ImageLoader;
- private ImageLoader(){}
- public static ImageLoader getInstance(){
- return instance;
- }
- }
二、懶漢式
- public class ImageLoader{
- private static ImageLoader instance;
- private ImageLoader(){}
- public static synchronized ImageLoader getInstance(){
- if(instance == null){
- instance = new ImageLoader();
- }
- return instance;
- }
- }
三、Double CheckLock實(shí)現(xiàn)單例
英文稍好點(diǎn)的東西,應(yīng)該都看懂了,DCL也就是雙重鎖判斷機(jī)制,直接上代碼。
- public class ImageLoader{
- private static ImageLoader instance;
- private ImageLoader(){}
- public static ImageLoader getInstance(){
- if(instance == null){
- synchronized (ImageLoader.class){
- if(instance == null){
- instance = new ImageLoader();
- }
- }
- }
- return instance;
- }
- }
四、靜態(tài)內(nèi)部類實(shí)現(xiàn)模式
直接上代碼
- public class ImageLoader{
- private static class InnerInstance{
- private static final ImageLoader instance = new ImageLoader();
- }
- private ImageLoader(){}
- public static ImageLoader(){
- return InnerInstance.instance;
- }
- }
可以發(fā)現(xiàn)這種方式,并未加鎖,因?yàn)榈谝淮渭虞dImageLoader類時(shí),并不會(huì)實(shí)例化單例對(duì)象,只有第一次調(diào)用getInstance()方法時(shí)會(huì)導(dǎo)致虛擬機(jī)加載InnerInstance類,這種
方式不僅能保證對(duì)象的單一性,還避免加鎖帶來(lái)的性能問(wèn)題,又啟動(dòng)了延遲加載的優(yōu)化,所以這就是單例模式的終極實(shí)現(xiàn)版本,也是推薦使用的方式。