標籤:style blog http color java strong ar 檔案 2014
什麼是單例模式?
單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體而且該執行個體易於外界訪問,從而方便對執行個體個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
單例模式的特點:
1、單例類有且只能有一個執行個體。
2、單例類需要自己建立一個自己的執行個體。
3、單例類需要為其他類提供這個執行個體。
哪些地方經常用到單例?
在電腦系統中,設定檔,線程池,緩衝,日誌對象,印表機等經常用到單例模式
所謂“一山不容二虎”,如果出現二虎很容易會出問題,比如設定檔,它終究只是一個檔案,如果同時有好幾個執行個體訪問它並執行修改操作,那麼這時候就會引發出一系列的問題
單例相對於多執行個體對象也更節約系統資源
單例模式常用的有幾種模式?
一般來講單例模式有三種,分別是:懶漢式,餓漢式,登記式。
下面直接上代碼說明吧
①一個類之所以能夠建立出執行個體是因為有構造方法的存在,只要我們把構造方法的存取修飾詞改成私人(private),外界就不能通過new來建立該類的執行個體。
②在單例類中自身new出一個對象,因為要被外界訪問,我們可以把它靜態化(static),以便外界訪問(類型.對象)。
③有時候我們需要控制這個對象,也處於安全起見,我們可以把繼續私人化(private),然後提供一個getter方法以便外界訪問。
SimpletonDemo1.java(單例類)
1 package com.lcw.simpleton; 2 3 public class SimpletonDemo1 { 4 //將構造方法私人化,阻止外界直接建立對象 5 private SimpletonDemo1() { 6 } 7 //提供static以便外界訪問 8 private static SimpletonDemo1 instance = new SimpletonDemo1(); 9 10 //提供getter方法以便外界訪問私人化對象,static SimpleDemo1傳回型別11 public static SimpletonDemo1 getInstance() {12 return instance;13 }14 }
SimpletonTest.java(測試類別)
1 package com.lcw.simpleton; 2 3 public class SimpletonTest { 4 public static void main(String[] args) { 5 SimpletonDemo1 s1=SimpletonDemo1.getInstance(); 6 SimpletonDemo1 s2=SimpletonDemo1.getInstance(); 7 8 if(s1==s2){//檢測對象的記憶體位址是否一致 9 System.out.println("s1和s2是同個對象");10 }else{11 System.out.println("s1和s2不是同個對象");12 }13 14 }15 }
效果如下:
上面所說的就是單例模式裡餓漢模式,為什麼叫餓漢模式呢?
由於這個執行個體是被static所修飾,被static修飾的成員屬於類所有,當類載入的時候,這個成員就被載入了,也就是說不管外界是否調用這個類,它都已經被載入了。
看起來好像是餓漢,不管三七二十一,先吃了你再說。
下面再來看下單例模式中的懶漢模式
就字面上的意思,其實已經很明白了“懶漢模式”,顧名思義不同於餓漢模式,既然餓漢模式是不管三七二十一先吃了再說,那麼懶漢模式當然就沒那麼勤快了,應該是被我們調用後的時候才去執行個體化對象。
它們的寫法很類似,只不過是在用private static聲明對象的時候不直接new對象,而是在gette方法裡再去執行個體化對象
然後判斷下這個對象是否為null,如果為null則執行個體化一個對象,如果不會空則直接返回對象。
下面看下具體代碼
SimpletonDemo2.java(單例類)
1 package com.lcw.simpleton; 2 3 public class SimpletonDemo2 { 4 //將構造方法私人化,阻止外界直接建立對象 5 private SimpletonDemo2() { 6 } 7 //提供static以便外界訪問 8 private static SimpletonDemo2 instance = new SimpletonDemo2(); 9 10 //提供getter方法以便外界訪問私人化對象,static SimpleDemo1傳回型別11 public static SimpletonDemo2 getInstance() {12 return instance;13 }14 }
SimpletonTest.java(測試類別)
1 package com.lcw.simpleton; 2 3 public class SimpletonTest { 4 public static void main(String[] args) { 5 SimpletonDemo1 s1=SimpletonDemo1.getInstance(); 6 SimpletonDemo1 s2=SimpletonDemo1.getInstance(); 7 8 if(s1==s2){//檢測對象的記憶體位址是否一致 9 System.out.println("s1和s2是同個對象");10 }else{11 System.out.println("s1和s2不是同個對象");12 }13 14 15 SimpletonDemo2 s3=SimpletonDemo2.getInstance();16 SimpletonDemo2 s4=SimpletonDemo2.getInstance();17 18 if(s3==s4){//檢測對象的記憶體位址是否一致19 System.out.println("s3和s4是同個對象");20 }else{21 System.out.println("s3和s4不是同個對象");22 }23 24 }25 }
效果如下:
總結下兩種模式的區別:
1、餓漢模式,在載入類的時候比較慢,由於它還要去執行個體化一個對象,但在運行調用中的速度會比較快。
2、懶漢模式,在載入類的時候比較快,由於在載入類的時候不需要去執行個體化對象,但在運行調用時的速度比較慢,由於還要去做判斷。
還有一點很重要的是,餓漢模式是屬於安全執行緒,而懶漢模式屬於線程不安全。
軟體設計模式之單例模式