設計模式之Singleton - 單態模式

來源:互聯網
上載者:User
Singleton模式也叫單態模式,是由GoF提出的23種設計模式中的一種。Singleton模式是一種對象建立型模式,它為一個類產生唯一的執行個體對象,並提供一個對該執行個體的全域存取方法。本文介紹設計模式中的單態(Singleton)模式的概念,用法,以及實際應用中怎麼樣使用Singleton模式進行開發。Singleton的概念

Singleton模式是一種對象建立型模式,使用Singleton模式,可以保證為一個類只產生唯一的執行個體對象。也就是說,在整個程式空間中,該類只存在一個執行個體對象。
其實,GoF對Singleton模式的定義是:保證一個類只有一個執行個體存在,同時提供能對該執行個體加以訪問的全域存取方法。

為什麼要使用Singleton模式呢?

在應用系統開發中,我們常常有以下需求:
- 在多個線程之間,比如servlet環境,共用同一個資源或者操作同一個對象
- 在整個程式空間使用全域變數,共用資源
- 大規模系統中,為了效能的考慮,需要節省對象的建立時間
等等

因為Singleton模式可以保證為一個類只產生唯一的執行個體對象,所以這些情況,Singleton模式就派上用場了。

Singleton模式的實現

Singleton模式是設計模式中相對比較簡單的模式之一。理解以及使用方法都比較簡單。
Singleton模式有多個實現方法。但目前,每一種都存在或多或少的問題。

下面我們將給出幾種實現方法,同時對它們加以比較。

第一種方法:
這是一種最簡單的實現方法。但是一種相對有效實現方法。現在,一般推薦這一種方法作為Singleton模式的實現方法。
//1)使用final關鍵字修改class,防止子類繼承
public final class Singleton {
    //2)Singleton自身唯一執行個體instance
    private static final Singleton instance = new Singleton();
    //3)private構造方法。防止外部調用者使用new建立新的執行個體
    private Singleton(){};
    //4)提供唯一執行個體的全域訪問點
    public static Singleton getInstance(){
        return Singleton.instance;
    }

    ...
}
注意上述1),2),3),4)部分,這是Singleton模式實現的幾個關鍵。
我們注意到,這種方法沒有對instance = new Singleton()部分作同期化操作,但考慮到Singleton執行個體的產生只是在最初被調用時才執行一次,如果我們在調用時適當處理一下,比如在程式的統一初期化時(SERVLET環境的情況下可以在容器被初始化時如SevletListener裡)調用一下Singleton,就不會存線上程安全問題。

第二種方法:
public final class Singleton {
    private static Singleton instance;
    private Singleton(){};
    public static synchronized Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}
該方法把Singleton執行個體產生放到了getInstance方法裡,同時使用synchronized解決了安全執行緒問題。
但如果在高並發的應用系統中,大量的線程在調用getInstance時會受到阻塞,系統的效能將受到嚴重影響。

第三種方法:
public final class Singleton {
    private static Singleton instance;
    private Singleton(){};
    public static Singleton getInstance(){
        if(instance == null){
            synchronized (this) {
                //double-check
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
該方法也叫double-check(雙重檢查)方法,把線程同步synchronized放到只會被執行一次的同步塊裡。該方法雖然解消了效能瓶頸問題,但該方法被指出並不是安全執行緒的(不同步的情況下參考型別不是安全執行緒的)。

第四種方法:
public final class Singleton {
    private volatile static Singleton instance;
    private Singleton(){};
    public static Singleton getInstance(){
        if(instance == null){
            synchronized (this) {
                //double-check
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.