設(shè)計(jì)模式一(單例模式)

NightRain.png

定義

保證一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。

使用場(chǎng)景

  • 整個(gè)項(xiàng)目需要一個(gè)共享訪問(wèn)點(diǎn)或數(shù)據(jù)
  • 創(chuàng)建一個(gè)對(duì)象需要消耗的資源過(guò)多,比如訪問(wèn)I/0或者數(shù)據(jù)庫(kù)等資源
  • 工具類(lèi)對(duì)象

示例

1. 餓漢式

public class SingleInstance {
    /**
     * 餓漢式
     * 線程:安全
     * 優(yōu)點(diǎn):基于類(lèi)加載機(jī)制,獲取對(duì)象快
     * 缺點(diǎn):由于在加載中就完成實(shí)例化,如果未使用這個(gè)實(shí)例,會(huì)造成內(nèi)存浪費(fèi)
     */
    private static SingleInstance mSingleInstance = new SingleInstance();

    private SingleInstance() {

    }

    public static SingleInstance getInstance() {
        return mSingleInstance;
    }
}

2. 懶漢式

public class SingleInstance {
    /**
     * 懶漢式
     * 線程:不安全
     * 優(yōu)點(diǎn):節(jié)約內(nèi)存資源,只有第一次調(diào)用才會(huì)實(shí)例化
     * 缺點(diǎn):第一次加載相對(duì)餓漢式慢一些,并且多線程可能無(wú)法正常工作
     */
    private static SingleInstance mSingleInstance = null;

    private SingleInstance() {

    }

    public static SingleInstance getInstance() {
        if (mSingleInstance == null) {
            mSingleInstance = new SingleInstance();
        }
        return mSingleInstance;
    }
}

3. 雙重檢查模式

public class SingleInstance {
    /**
     * 雙重檢查模式
     * 線程:安全
     * 優(yōu)點(diǎn):資源利用率高,只有第一次使用才會(huì)實(shí)例化
     * 缺點(diǎn):第一次加載稍慢
     */
    private static volatile SingleInstance mSingleInstance = null;

    private SingleInstance() {

    }

    public static SingleInstance getInstance() {
        if (mSingleInstance == null) {
            synchronized (SingleInstance.class) {
                if (mSingleInstance == null) {
                    mSingleInstance = new SingleInstance();
                }
            }
        }
        return mSingleInstance;
    }
}

4. 靜態(tài)內(nèi)部類(lèi)單例模式

public class SingleInstance {
    /**
     * 靜態(tài)內(nèi)部類(lèi)
     * 線程:安全
     * 優(yōu)點(diǎn):在保證線程安全的同時(shí),基本沒(méi)有性能損耗
     * 推薦使用靜態(tài)內(nèi)部類(lèi)做單例
     */
    private SingleInstance() {

    }

    public static SingleInstance getInstance() {
        return SingleInstanceHolder.sSingleInstance;
    }

    private static class SingleInstanceHolder {
        private static final SingleInstance sSingleInstance = new SingleInstance();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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