1. 程式人生 > >java的單例設計模式

java的單例設計模式

一個 pre 成員變量 餓漢式 設計 單例模式 建立 單例設計模式 線程

單例設計模式是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的單例設計模式