設計模式:單例模式

單例模式:

    單利模式是一種對象創建型模式,使用單例模式,可以保證爲一個類只生成唯一的實例對象。也就是說,在整個程序空間中,該類只存在一個實例對象。

    其實,GoF對單例模式的定義是:保證一個類只有一個實例存在,同時提供能對該實例加以訪問的全局訪問方法。  

爲什麼使用單例模式?

  在應用系統開發中,我們常常有以下需求:在多個線程之間,比如servlet環境,共享同一個資源或者操作同一個對象

  在整個程序空間使用全局變量,共享資源

  大規模系統中,爲了性能的考慮,需要節省對象的創建時間等等。

   因爲singleton模式可以保證爲一個類只生成唯一的實例對象,所以這些情況,singleton模式就派上用場了。


單例模式實現:

       1.餓漢式

package singleton;

/**
 * 車票的單例
 * 餓漢式
 * @author guosheng
 *
 */
public class CardSingleTon {
    
    private static CardSingleTon cst = new CardSingleTon(50);
    
    public CardSingleTon(int cardNum){
        this.cardNum = cardNum;
    }
    
    private int cardNum;

    public int getCardNum() {
        return cardNum;
    }

    public void setCardNum(int cardNum) {
        this.cardNum = cardNum;
    }
    
    public static CardSingleTon getCardSingleTon(){
        return cst;
    }
}

        2.懶漢式


package singleton;

/**
 * 車票的單例
 * 懶漢式----------------多線程不安全
 * @author guosheng
 *
 */
public class CardSingleTon {
    
    //private static CardSingleTon cst = new CardSingleTon(50);
    private static CardSingleTon cst;
    
    public CardSingleTon(int cardNum){
        this.cardNum = cardNum;
    }
    
    private int cardNum;

    public int getCardNum() {
        return cardNum;
    }

    public void setCardNum(int cardNum) {
        this.cardNum = cardNum;
    }
    
    public static CardSingleTon getCardSingleTon(){
        if(null == cst){
            cst = new CardSingleTon(50);
        }
        return cst;
    }
}


       3.雙重檢查

/**
 * 車票的單例
 * 雙重檢查
 * @author guosheng
 *
 */
public class CardSingleTon {
    
    //private static CardSingleTon cst = new CardSingleTon(50);
    private static CardSingleTon cst;
    
    public CardSingleTon(int cardNum){
        this.cardNum = cardNum;
    }
    
    private int cardNum;

    public int getCardNum() {
        return cardNum;
    }

    public void setCardNum(int cardNum) {
        this.cardNum = cardNum;
    }
    
    public static CardSingleTon getCardSingleTon(){
        if(null == cst){
            synchronized(cst){
                if(null == cst){
                    cst = new CardSingleTon(50);
                }
            }
        }
        return cst;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章