標籤:style tin 靜態 blog class 私人化 引用 效率 懶漢
單例設計模式是java的一種設計模式,它是指在設計一個類時,要保證在整個程式運行期間針對該類記憶體中只存在一個執行個體對象。
單例設計模式包括餓漢式和懶漢式兩種模式。
餓漢式:類一載入進記憶體就建立好了對象;
餓漢式的代碼如下:
package com.sjk.sheng;/** * 單例模式之餓漢式 * @author sjk * */public class Single { //將建構函式私人化,不讓別的類建立該類對象 private Single(){} //自己建立一個對象 private static final Single s = new Single(); //提供一個公用訪問方式 public static Single getInstance() { return s; }}
懶漢式:類載入進記憶體的時候,對象還沒有存在,只有調用了getInstance()方法時,對象才開始建立。
懶漢式的代碼如下:
package com.sjk.sheng;/** * 單例模式之懶漢式 * @author sjk * */public class Single { private Single(){} private static Single s; public static Single getInstance() { if(s==null) //如果對象為空白就建立一個 s=new Single(); return s; }}
懶漢式是消極式載入,如果多個線程同時操作懶漢式時就有可能出現安全執行緒問題,解決安全執行緒問題可以加同步來解決。但是加了同步之後,每一次都要比較鎖,效率就變慢了,所以可以加雙重判斷來提高程式效率。
如將上述懶漢式的Instance函數改成同步:
package com.sjk.sheng;/** * 單例模式之懶漢式安全執行緒問題的解決方案 * * @author sjk * */public class Single { // 聲明本類的一個私人的成員變數 private static Single single; // 第一步 : 私人化構造方法 private Single() { } // 第三步:提供一個公用的方法擷取該類的執行個體對象 public static Single getInstance() { if (single == null) { synchronized (single) { if (single == null) { single = new Single(); } } } return single; }}
以上通過餓漢式和懶漢式實現了單例模式,它具備如下的特點:
1)類的構造方法使用private修飾,聲明為私人,這樣就不能在類的外部使用new關鍵字來建立執行個體對象了。
2)在類的內部建立一個該類的執行個體對象,並使用靜態變數s引用該對象,由於變數應該禁止外界直接存取,因此使用private修飾,聲明為私人成員。
3)為了讓類的外部能夠獲得類的執行個體對象,需要定義一個靜態方法getInstance(),用於返回該類的執行個體s。由於是靜態,外部可以通過“類名.方法名”的方式來訪問。
因此餓漢式的單例模式也可以寫成以下形式:
package com.sjk.sheng;/** * 單例模式之餓漢式的另一種形式 * @author sjk * */public class Single { private Single() {} public static final Single s = new Single();}
在上面代碼中,首先將該類的構造方法私人化,防止外界建立該類的執行個體。在該類的內部建立了該類的執行個體對象,並使用靜態變數s來引用,變數s的前面有三個修飾符,其中,public的作用是允許外部直接存取該變數,static的作用是讓外部可以使用“類名.變數名”的方式來訪問變數,final的作用是禁止外部對該變數進行修改。由於訪問變數s是獲得Single類執行個體對象的唯一途徑,因此該類實現了單例。
java的單例設計模式