Java入門之初識設計模式—單列模式

yi杯咖啡發表於2018-08-01

設計模式

是軟體開發人員在軟體開發過程中面臨的一般問題的解決方案

單例模式

目的:使得類的一個物件成為該類系統中的唯一例項

定義:一個類有且僅有一個例項,並且自行例項化向整個系統提供

因此,設計要點是:

  1. 某個類只能有一個例項

  2. 必須自行建立例項

  3. 必須自行向整個系統提供這個例項

實現:

  1. 只提供私有的構造方法

  2. 含有一個該類的靜態私有物件

  3. 提供一個靜態的公有方法用於建立、獲取靜態私有物件

程式碼實現方案:

  1. 餓漢式

  2. 懶漢式

餓漢式

類載入時,靜態例項物件完成了例項化操作;空間換時間。(物件建立過程中例項化)

餓漢式執行緒安全

新建檔案SingletonOne.java

/**
* 餓漢式
*/
public class SingletonOne {
    //1.建立類中的私有建構函式
    private SingletonOne(){

    }
    //2.建立該型別的私有靜態例項
    private static SingletonOne instance = new SingletonOne();
    //3.建立公有靜態方法返回靜態例項物件
    public static SingletonOne getInstance(){
        return instance;
    }
}

新建檔案Test.java

public class Test {
    public static void main(String[] args) {
        SingletonOne one = SingletonOne.getInstance();
        SingletonOne two = SingletonOne.getInstance();
        System.out.println(one);
        System.out.println(two);
    }
}

輸出結果可以看到是同一個類的地址。

懶漢式

類載入時並未例項化,第一次使用時才進行例項化;時間換空間。(靜態公有方法中例項化)

懶漢式存線上程風險

懶漢式執行緒安全的解決方案:(此處大致介紹下,後邊線上程篇會詳細介紹)

  • 同步鎖

  • 雙重校驗鎖

  • 靜態內部類

  • 列舉

新建檔案:SingletonOne.java

public class SingletonTwo {
    //1.建立私有構造方法
    private SingletonTwo(){

    }
    //2.建立靜態的該類例項物件
    private static SingletonTwo instance = null;
    //3.建立開放的靜態方法提供例項物件
    public static SingletonTwo getInstance(){
        if(instance == null)
            instance = new SingletonTwo();
        return instance;
    }
}

新建檔案Test.java

public class Test {
    public static void main(String[] args) {
        SingletonTwo one = SingletonTwo.getInstance();
        SingletonTwo two = SingletonTwo.getInstance();
        System.out.println(one);
        System.out.println(two);
    }
}

輸出結果同上餓漢式程式碼

單列模式的特點以及應用場景

優點:

  • 在記憶體中只有一個物件,節省記憶體

  • 避免頻繁的建立和銷燬物件,提高效能

  • 避免對共享資源的多重佔用

缺點:

  • 擴充套件比較困難

  • 如果例項化後的物件長期不利用,系統將預設認為垃圾,進行回收,造成物件狀態丟失

使用場景:

  1. 建立物件時佔用資源過多,但同時又需要用到該類物件

  2. 對系統內資源要求統一讀寫,如讀寫配置資訊

  3. 當多個例項存在可能引起程式邏輯錯誤,如號碼生成器


相關文章