Java入門學習-學會使用靜態變數、掌握單例模式的用法和原理

gongjinsi發表於2017-06-19

靜態變數在上一節已學習使用過,總結為類變數,只佔一塊記憶體,與例項化無關。

單例模式的意思是,每個類只有一個例項(一般用於資源管理,可以解決生產者-消費者問題)。

引用一段話

意圖:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
主要解決:一個全域性使用的類頻繁地建立與銷燬。
何時使用:當您想控制例項數目,節省系統資源的時候。
如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有則建立。
關鍵程式碼:建構函式是私有的。
應用例項: 1、一個黨只能有一個主席。 2、Windows 是多程式多執行緒的,在操作一個檔案的時候,就不可避免地出現多個程式或執行緒同時操作一個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。 3、一些裝置管理器常常設計為單例模式,比如一個電腦有兩臺印表機,在輸出的時候就要處理不能兩臺印表機列印同一個檔案。
優點: 1、在記憶體裡只有一個例項,減少了記憶體的開銷,尤其是頻繁的建立和銷燬例項(比如管理學院首頁頁面快取)。 2、避免對資源的多重佔用(比如寫檔案操作)。
缺點:沒有介面,不能繼承,與單一職責原則衝突,一個類應該只關心內部邏輯,而不關心外面怎麼樣來例項化。
使用場景: 1、要求生產唯一序列號。 2、WEB 中的計數器,不用每次重新整理都在資料庫里加一次,用單例先快取起來。 3、建立的一個物件需要消耗的資源過多,比如 I/O 與資料庫的連線等。
注意事項:getInstance() 方法中需要使用同步鎖 synchronized (Singleton.class) 防止多執行緒同時進入造成 instance 被多次例項化。

//建立單例

public class SingleExample {
    //建立一個私有的,靜態的例項
    private  static SingleExample example =new SingleExample();

    //建立一個構造方法,不被例項化
    private SingleExample(){
    }

    //建立一個唯一可用的物件
    public static SingleExample getExample(){
        return example;
    }
}
public class UseSingle {
//使用單例
    public static void main(String[] args) {
        //SingleExample se=new SingleExample();  //提示 The constructor SingleExample() is not visible。說明私有的構造方法不能例項了

        SingleExample se=SingleExample.getExample();
        se.test();  //輸出Hello SingleExample
    }
}

相關文章