設計模式--單例模式

Cheng發表於2015-03-30

什麼是設計模式

設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使程式碼編制真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。

設計模式分類

設計模式分為三種型別,共23種

  • 建立型模式:單例模式、抽象工廠模式、建造者模式、工廠模式、原型模式。
  • 結構型模式:介面卡模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。
  • 行為型模式:模版方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、直譯器模式、狀態模式、策略模式、職責鏈模式、訪問者模式。

單例模式

單例模式是最簡單的設計模式之一,保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。

適用性

  • 當類只能有一個例項而且客戶可以從一個眾所周知的訪問點訪問它時。
  • 當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改程式碼就能使用一個擴充套件的例項時。

例如:

配置檔案、工具類、執行緒池、快取、日誌物件等

如果以上這些物件創造出多個例項,就會導致許多問題, 比如佔用過多資源,不一致的結果等。那麼如何保證整個應用中某個例項有且只有一個呢?這裡我們就可以通過 單例模式來實現了。

單例模式種類

常見的單例模式分為如下兩類:

  • 懶漢模式(執行緒不安全的)
  • 餓漢模式(執行緒安全的)

懶漢模式

class InstanceDemo2
{
    public static void main(String[] args){
        懶漢 懶=懶漢.getInstance();
        懶漢 漢=懶漢.getInstance();
        if(懶==漢){
            System.out.println("是同一個例項");
        }else{
            System.out.println("不是同一個例項");
        }
        
    }
}


//懶漢模式
class 懶漢{
    //1,將構造方法私有化,不允許外部直接建立物件
    private 懶漢(){}
    //2,宣告類的唯一例項,使用private static 修飾
    private static 懶漢 lazy; //預設值為null
    //定義getInstance
    public static 懶漢 getInstance(){
        if(lazy==null){
            lazy=new 懶漢();
        }
        return lazy;
    }
}

餓漢模式

class InstanceDemo
{
    public static void main(String[] args){
        餓漢 餓=餓漢.getInstance();
        餓漢 漢=餓漢.getInstance();
        if(餓==漢){
            System.out.println("是同一個例項");
        }else{
            System.out.println("不是同一個例項");
        }
    }
}

class 餓漢{
    //1.限制外界不能隨意的new物件
    private  餓漢(){}  
    //在類內部造物件,然後在將物件送出去
    //2.建立物件
    private static  final 餓漢 h=new 餓漢();
    //3.提供一個用於獲例項的方法, 使用public static修飾
    public static 餓漢 getInstance(){
        return h;
    }
}

兩種模式的區別

餓漢模式的特點是載入類是比較慢,但是執行時獲取物件的速度比較快,執行緒安全,懶漢模式的特點是載入類是比較快,但是執行獲取物件的速度比較慢,執行緒不安全

如以上文章或連結對你有幫助的話,別忘了在文章結尾處輕輕點選一下 “還不錯”按鈕或到頁面右下角點選 “贊一個” 按鈕哦。你也可以點選頁面右邊“分享”懸浮按鈕哦,讓更多的人閱讀這篇文章。

作者:Li-Cheng
由於本人水平有限,文章在表述和程式碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論哦。你也可以關注我,一起學習哦!

(^_^)如果您覺得此文對您有幫助,打個賞喝個咖啡(^_^)

相關文章