首頁  >  文章  >  Java  >  java 單例模式詳解

java 單例模式詳解

巴扎黑
巴扎黑原創
2017-09-18 11:32:401172瀏覽

這篇文章主要介紹了java 單例模式(餓漢模式與懶漢模式)的相關資料,希望透過本文大家能掌握這部分內容,需要的朋友可以參考下

java 單例模式

餓漢式單例

對於餓漢模式,我們可這樣理解:此單例類別非常餓,迫切需要吃東西,所以它在類別載入的時候就立即創建物件。

懶漢式單例類別

對於懶漢模式,我們可以這樣理解:這個單例類別非常懶,只有在自身需要的時候才會行動,從來不知道及早做好準備。它在需要對象的時候,才判斷是否已有對象,如果沒有就立即創建一個對象,然後返回,如果已有對象就不再創建,立即返回。

單例設計模式常用於JDBC連結資料庫

注意:

1 我們常用的是第一種餓漢式,因為:

 (1)既然採用了單例設計模式,就是為了使用單例類別的對象,所以就先把他實例化出來.

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

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

因為被final關鍵字修飾的類別,不能被繼承,被final修飾的成員變數不可以被修改.

此處用了final為了強化和重點突出:"同一物件"這個概念-只有這麼一個物件,而且它是不可以被修改的.

#如果不用final修飾Single SINGLE那麼就會有這麼一種情況:業務很複雜,在不經意間就修改了此對象,造成各種錯誤.

第一種(餓漢式):

想法:

(1)不讓其他類別建立該類別的物件.即將建構子設定為私有!
(2)自訂一個本類別物件
(3)將自訂的物件提供出去.即定義一個get方法,並傳回值為此類的物件。

 分析:

 第一步:將單一範例類別中建構函數私有化了且利用一個get()函數向外提供此類的對象,所以其他類別無法建構此類的物件。
 第二步:但其他類別要想呼叫此單例類別裡的方法,於是只有採用內名.方法名()來實現,這就要求這個方法必須是靜態static的。
 第三步:又因為靜態方法只能存取靜態成員!所以要將SINGLE設定為靜態的


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是同一对象即: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是同一对象即: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(){//多线程时加上synchronized是关键!!! 
      if(SINGLE==null){ 
         SINGLE=new Single(); 
         return SINGLE; 
       } 
      else{ 
         return SINGLE; 
        } 
   } 
}

以上就是對java 單例設計模式的詳解,如有疑問請留言或到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

以上是java 單例模式詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn