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

設計模式

是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案

單例模式

目的:使得類的一個對象成為該類系統(tǒng)中的唯一實例

定義:一個類有且僅有一個實例,并且自行實例化向整個系統(tǒng)提供

因此,設計要點是:

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

  2. 必須自行創(chuàng)建實例

  3. 必須自行向整個系統(tǒng)提供這個實例

實現(xiàn):

  1. 只提供私有的構(gòu)造方法

  2. 含有一個該類的靜態(tài)私有對象

  3. 提供一個靜態(tài)的公有方法用于創(chuàng)建、獲取靜態(tài)私有對象

代碼實現(xiàn)方案:

  1. 餓漢式

  2. 懶漢式

餓漢式

類加載時,靜態(tài)實例對象完成了實例化操作;空間換時間。(對象創(chuàng)建過程中實例化)

餓漢式線程安全

新建文件SingletonOne.java

/**
* 餓漢式
*/
public class SingletonOne {
    //1.創(chuàng)建類中的私有構(gòu)造函數(shù)
    private SingletonOne(){

    }
    //2.創(chuàng)建該類型的私有靜態(tài)實例
    private static SingletonOne instance = new SingletonOne();
    //3.創(chuàng)建公有靜態(tài)方法返回靜態(tài)實例對象
    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);
    }
}

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

懶漢式

類加載時并未實例化,第一次使用時才進行實例化;時間換空間。(靜態(tài)公有方法中實例化)

懶漢式存在線程風險

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

  • 同步鎖

  • 雙重校驗鎖

  • 靜態(tài)內(nèi)部類

  • 枚舉

新建文件:SingletonOne.java

public class SingletonTwo {
    //1.創(chuàng)建私有構(gòu)造方法
    private SingletonTwo(){

    }
    //2.創(chuàng)建靜態(tài)的該類實例對象
    private static SingletonTwo instance = null;
    //3.創(chuàng)建開放的靜態(tài)方法提供實例對象
    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);
    }
}

輸出結(jié)果同上餓漢式代碼

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

優(yōu)點:

  • 在內(nèi)存中只有一個對象,節(jié)省內(nèi)存

  • 避免頻繁的創(chuàng)建和銷毀對象,提高性能

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

缺點:

  • 擴展比較困難

  • 如果實例化后的對象長期不利用,系統(tǒng)將默認認為垃圾,進行回收,造成對象狀態(tài)丟失

使用場景:

  1. 創(chuàng)建對象時占用資源過多,但同時又需要用到該類對象

  2. 對系統(tǒng)內(nèi)資源要求統(tǒng)一讀寫,如讀寫配置信息

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容