国产午夜精品理论片,国产亚洲精品久久久999蜜臀,国产精品久久久久久久久免费,国产卡一卡二卡3卡4乱码,国产精品午夜无码av天美传媒

單例模式的五種實(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)方式。

一、餓漢式

  1. public class ImageLoader{  
  2.   
  3.      private static ImageLoader instance = new ImageLoader;  
  4.      private ImageLoader(){}  
  5.      public static ImageLoader getInstance(){   
  6.        return instance;   
  7.   }  
  8. }  

餓漢式顧名思義,就是這個(gè)漢子很餓,一上來(lái)就把單例對(duì)象創(chuàng)建出來(lái)了,要用的時(shí)候直接返回即可,這種可以說(shuō)是單例模式中最簡(jiǎn)單的一種實(shí)現(xiàn)方式。但是問(wèn)題也比較明顯。單例在還沒(méi)有使用到的時(shí)候,初始化就已經(jīng)完成了。也就是說(shuō),如果程序從頭到位都沒(méi)用使用這個(gè)單例的話,單例的對(duì)象還是會(huì)創(chuàng)建。這就造成了不必要的資源浪費(fèi)。所以不推薦這種實(shí)現(xiàn)方式。

二、懶漢式

  1. public class ImageLoader{  
  2.      private static ImageLoader instance;  
  3.      private ImageLoader(){}  
  4.      public static synchronized ImageLoader getInstance(){   
  5.             if(instance == null){   
  6.                  instance = new ImageLoader();   
  7.            }   
  8.             return instance;  
  9.       }  
  10. }  

餓漢式也顧名思義,就是這個(gè)漢子比較懶,一開(kāi)始的時(shí)候什么也不做,知道要使用的時(shí)候采取創(chuàng)建實(shí)例的對(duì)象。看起來(lái)還不錯(cuò),只有在使用實(shí)例的時(shí)候,我們才回去創(chuàng)建對(duì)象。但是細(xì)心的同學(xué)可能發(fā)現(xiàn)了,我們?cè)讷@取實(shí)例的方法上加了鎖,避免多線程引發(fā)的創(chuàng)建多個(gè)單例的情況。多線程的問(wèn)題是避免了,但也造成了整體性能的下降,每次使用單例對(duì)象,都需要鎖判斷,降低了整體性能。很明顯,懶漢式也不是我們所要追求的目標(biāo)。

三、Double CheckLock實(shí)現(xiàn)單例

英文稍好點(diǎn)的東西,應(yīng)該都看懂了,DCL也就是雙重鎖判斷機(jī)制,直接上代碼。

  1. public class ImageLoader{  
  2.      private static ImageLoader instance;  
  3.      private ImageLoader(){}  
  4.      public static ImageLoader getInstance(){  
  5.            if(instance == null){  
  6.                    synchronized (ImageLoader.class){  
  7.                         if(instance == null){  
  8.                            instance = new ImageLoader();  
  9.                            }  
  10.                     }  
  11.              }   
  12.              return instance;   
  13.         }  
  14. }  

可以看到,在獲取單例對(duì)象的時(shí)候,我們先進(jìn)行了兩為空判斷,并且在第二次判斷前加了鎖,這就讓程序變得更加優(yōu)秀,在使用的時(shí)候,只會(huì)前幾次獲取單例對(duì)象的時(shí)候會(huì)進(jìn)行鎖判斷,一旦單例對(duì)象創(chuàng)建完成,鎖的任務(wù)也就完成了,在懶漢式的基礎(chǔ)上,提高了性能。DCL是使用最多的單例實(shí)現(xiàn)方式,能夠在使用的時(shí)候才進(jìn)行單例對(duì)象的初始化創(chuàng)建,并且能夠在絕大多數(shù)情況下保證對(duì)象的唯一性的正確性。請(qǐng)注意,是絕大多數(shù)情況下,也就是說(shuō),這種模式也不能完全保證單例的對(duì)象的完美實(shí)現(xiàn),但是,就一般情況下,這種模式都能滿足需求。俗話說(shuō),學(xué)無(wú)止境,接下來(lái)我們就來(lái)看看單例模式的終極實(shí)現(xiàn)版本。

四、靜態(tài)內(nèi)部類實(shí)現(xiàn)模式

直接上代碼

  1. public class ImageLoader{  
  2.     private static class InnerInstance{  
  3.        private static final ImageLoader instance = new ImageLoader();  
  4.     }  
  5.     private ImageLoader(){}  
  6.     public static ImageLoader(){  
  7.         return InnerInstance.instance;  
  8.    }  
  9. }  


可以發(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)版本,也是推薦使用的方式。
原文地址:http://blog.csdn.net/soul_code/article/details/50183765

返回