淺談js單例模式

java單例模式

說到單例設計模式,Java中常用
java的單例模式一般分兩種,懶漢模式和餓漢模式java

懶漢模式

class singleDemo {
    private static demoTarget;
    privete singleDemo () {};
    public static singleDemo getInstance (data) {
        if (demoTarget === null) {
           demoTarget = new singleDemo()
        }
        return demoTarget
    }
}

OK,簡單寫了下
1.私有化構造函數
2.在public獲取實例的方法中返回實例化對象設計模式

(雖然不少大佬都寫過啦,可是小生爲了加深記憶便再寫一遍)
雖然實現了單例模式,可是未考慮到線程安全,多個線程訪問能可能建立多個實例,也就是高併發時候單例模式會建立多個實例,那要如何解決此類問題呢?
這時候有兩種,一種是原來的懶漢模式藉助synchronized變身成爲線程安全的懶漢模式,另外一種則是餓漢模式安全

懶漢模式 (線程安全)

class singleDemo {
    private static demoTarget;
    privete singleDemo () {};
    public static synchronized singleDemo  getInstance (data) {
        if (demoTarget === null) {
            demoTarget= new singleDemo()
        }
        return demoTarget
    }
}

餓漢模式

什麼是餓漢模式呢?就是在懶漢模式的基礎加一層鎖,能保證單例多線程

class singleDemo {
    private static demoTarget = new singleDemo();
    private singleDemo () {};
    public static singleDemo getInstance (data) {
        return demoTarget
    }
}

好啦,簡單的把java經常使用的兩種單例模式給寫了下,???標題不是js的單例模式嘛?標題寫錯了?沒寫錯,小生只是回憶一下java的知識,望各位大佬見諒
在js中如何實現單例呢?併發

js單例模式

因爲js都是單線程的,因此並不像java那樣麻煩,並不須要考慮多線程狀況,沒錯,只要能獲取單例就行,廢話不說,代碼先上函數

let Single = (function () {
        function constructor () {}
        var instance;
        function getInstance(){
            if (!instance) {
                instance = new constructor()
            }
            return instance
        }
        return {
            getInstance: getInstance
        }
    })()
    const demo1 = Single.getInstance()
    const demo2 = Single.getInstance()
    console.log(demo1 === demo2) // true
相關文章
相關標籤/搜索