亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java 單例模式(餓漢模式與懶漢模式)

 更新時(shí)間:2017年09月05日 11:15:37   作者:lfdfhl  
這篇文章主要介紹了java 單例模式(餓漢模式與懶漢模式)的相關(guān)資料,希望通過(guò)本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下

java 單例模式

餓漢式單例

對(duì)于餓漢模式,我們可這樣理解:該單例類(lèi)非常餓,迫切需要吃東西,所以它在類(lèi)加載的時(shí)候就立即創(chuàng)建對(duì)象。

懶漢式單例類(lèi)

對(duì)于懶漢模式,我們可以這樣理解:該單例類(lèi)非常懶,只有在自身需要的時(shí)候才會(huì)行動(dòng),從來(lái)不知道及早做好準(zhǔn)備。它在需要對(duì)象的時(shí)候,才判斷是否已有對(duì)象,如果沒(méi)有就立即創(chuàng)建一個(gè)對(duì)象,然后返回,如果已有對(duì)象就不再創(chuàng)建,立即返回。

單例設(shè)計(jì)模式常用于JDBC鏈接數(shù)據(jù)庫(kù)

注意:

1 我們常用的是第一種餓漢式,因?yàn)?

 (1)既然采用了單例設(shè)計(jì)模式,就是為了使用單例類(lèi)的對(duì)象,所以就先把他實(shí)例化出來(lái).

 (2)在懶漢式中存在一定的安全隱患,需要加上同步關(guān)鍵字synchronized,否則就談不上單例了,但是加上了synchronized效率就稍遜了

2 在第一種辦法中,代碼private static final Single SINGLE=new Single();為什么有final呢?

因?yàn)楸籪inal關(guān)鍵字修飾的類(lèi),不能被繼承,被final修飾的成員變量不可以被修改.

此處用了final為了強(qiáng)化和重點(diǎn)突出:"同一對(duì)象"這個(gè)概念——只有這么一個(gè)對(duì)象,而且它是不可以被修改的.

如果不用final修飾 Single SINGLE那么就會(huì)有這么一種情況:業(yè)務(wù)很復(fù)雜,在不經(jīng)意間就修改了此對(duì)象,造成各種錯(cuò)誤.

第一種(餓漢式):

思路:

(1)不讓其他類(lèi)建立該類(lèi)的對(duì)象.即將構(gòu)造函數(shù)設(shè)置為私有!
(2)自定義一個(gè)本類(lèi)對(duì)象
(3)將自定義的對(duì)象提供出去.即定義一個(gè)get方法,返回值為此類(lèi)的對(duì)象。

 分析:

 第一步:將單例類(lèi)中構(gòu)造函數(shù)私有化了且利用一個(gè)get()函數(shù)向外提供此類(lèi)的對(duì)象,所以其他類(lèi)無(wú)法構(gòu)造此類(lèi)的對(duì)象。
 第二步:但其他類(lèi)要想調(diào)用此單例類(lèi)里的方法,于是只有采用內(nèi)名.方法名()來(lái)實(shí)現(xiàn),這就要求這個(gè)方法必須是靜態(tài)static的。
 第三步:又因?yàn)殪o態(tài)方法只能訪問(wèn)靜態(tài)成員!所以要將SINGLE設(shè)置為靜態(tài)的

public class SingleDemo { 
  public static void main(String[] args) { 
     Single s1=Single.getSingle(); 
     s1.setNumber(44); 
     Single s2=Single.getSingle(); 
     s2.setNumber(55); 
     System.out.println("s1.number="+s1.number); 
     System.out.println("s2.number="+s2.number); 
     if(s1.equals(s2)){ 
        System.out.println("s1與s2是同一對(duì)象即:s1==s2");//if條件成立 
       } 
   } 
} 
 
 
class Single{ 
  int number; 
  public int getNumber() { 
       return number; 
     } 
  public void setNumber(int number) { 
       this.number = number; 
     } 
  private Single(){};//第一步 
  private static final Single SINGLE=new Single();//第三步 
  public static Single getSingle(){//第一步和第二步 
       return SINGLE; 
  } 
} 

第二種(懶漢式):

package cn.com; 
public class SingleDemo2 { 
   public static void main(String[] args) { 
      Single s1=Single.getSingle(); 
      s1.setNumber(44); 
      Single s2=Single.getSingle(); 
      s2.setNumber(55); 
      System.out.println("s1.number="+s1.number); 
      System.out.println("s2.number="+s2.number); 
      if(s1.equals(s2)){ 
        System.out.println("s1與s2是同一對(duì)象即:s1==s2");//if條件成立 
       } 
     } 
 
 
} 
 
 
class Single{ 
   int number; 
   public int getNumber() { 
       return number; 
     } 
   public void setNumber(int number) { 
       this.number = number; 
     } 
   private Single(){}; 
   private static Single SINGLE=null; 
   public static synchronized Single getSingle(){//多線程時(shí)加上synchronized是關(guān)鍵?。?! 
      if(SINGLE==null){ 
         SINGLE=new Single(); 
         return SINGLE; 
       } 
      else{ 
         return SINGLE; 
        } 
   } 
} 


以上就是對(duì)java 單例設(shè)計(jì)模式的詳解,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論