重?fù)霬ava(十三)類與對象 單例模式

又一款面試筆試常用的知識點(diǎn)
單例模式又叫做 Singleton模式,指的是一個類,在一個JVM里,只有一個實(shí)例存在。也就是說單例,就是一個只能被實(shí)例化一次的類。比如,LOL里有一個怪叫大龍GiantDragon,只有一只,所以該類,只能被實(shí)例化一次。

餓漢式

GiantDragon 應(yīng)該只有一只,通過私有化其構(gòu)造方法,使得外部無法通過new 得到新的實(shí)例。
GiantDragon 提供了一個public static的getInstance方法,外部調(diào)用者通過該方法獲取12行定義的對象,而且每一次都是獲取同一個對象。 從而達(dá)到單例的目的。
這種單例模式又叫做餓漢式單例模式,無論如何都會創(chuàng)建一個實(shí)例

package charactor;
 
public class GiantDragon {
 
    //私有化構(gòu)造方法使得該類無法在外部通過new 進(jìn)行實(shí)例化
    private GiantDragon(){
         
    }
 
    //準(zhǔn)備一個類屬性,指向一個實(shí)例化對象。 因為是類屬性,所以只有一個
 
    private static GiantDragon instance = new GiantDragon();
     
    //public static 方法,提供給調(diào)用者獲取12行定義的對象
    public static GiantDragon getInstance(){
        return instance;
    }
     
}
package charactor;
 
public class TestGiantDragon {
 
    public static void main(String[] args) {
        //通過new實(shí)例化會報錯
//      GiantDragon g = new GiantDragon();
         
        //只能通過getInstance得到對象
         
        GiantDragon g1 = GiantDragon.getInstance();
        GiantDragon g2 = GiantDragon.getInstance();
        GiantDragon g3 = GiantDragon.getInstance();
         
        //都是同一個對象
        System.out.println(g1==g2);
        System.out.println(g1==g3);
    }
}

懶漢式

懶漢式單例模式與餓漢式單例模式不同,只有在調(diào)用getInstance的時候,才會創(chuàng)建實(shí)例

package charactor;
 
public class GiantDragon {
  
    //私有化構(gòu)造方法使得該類無法在外部通過new 進(jìn)行實(shí)例化
    private GiantDragon(){       
    }
  
    //準(zhǔn)備一個類屬性,用于指向一個實(shí)例化對象,但是暫時指向null
    private static GiantDragon instance;
      
    //public static 方法,返回實(shí)例對象
    public static GiantDragon getInstance(){
        //第一次訪問的時候,發(fā)現(xiàn)instance沒有指向任何對象,這時實(shí)例化一個對象
        if(null==instance){
            instance = new GiantDragon();
        }
        //返回 instance指向的對象
        return instance;
    }
      
}

使用時機(jī)

餓漢式是立即加載的方式,無論是否會用到這個對象,都會加載。
如果在構(gòu)造方法里寫了性能消耗較大,占時較久的代碼,比如建立與數(shù)據(jù)庫的連接,那么就會在啟動的時候感覺稍微有些卡頓。

懶漢式,是延遲加載的方式,只有使用的時候才會加載。 并且有線程安全的考量(鑒于同學(xué)們學(xué)習(xí)的進(jìn)度,暫時不對線程的章節(jié)做展開)。
使用懶漢式,在啟動的時候,會感覺到比餓漢式略快,因為并沒有做對象的實(shí)例化。 但是在第一次調(diào)用的時候,會進(jìn)行實(shí)例化操作,感覺上就略慢。

看業(yè)務(wù)需求,如果業(yè)務(wù)上允許有比較充分的啟動和初始化時間,就使用餓漢式,否則就使用懶漢式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容