單例模式

單例模式的定義:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。

例子1 用代理的方式實(shí)現(xiàn)單例模式

下面的代碼的功能是在頁面中創(chuàng)建一個(gè)div

  var CreateDiv = function(html){
            this.html = html;
            this.init();
        };
        CreateDiv.prototype.init = function(){
            var div = document.createElement('div');
            div.innerHTML = this.html;
            document.body.appendChild(div);
        };
  
        // 代理類
        var ProxyCreateDiv = (function(){
            var instance;
            return function(html){
                if(!instance){
                    instance = new CreateDiv(html);
                }
                return instance;
            }
        })();

        var a = new ProxyCreateDiv('div1');
        var b = new ProxyCreateDiv('div2');

        console.log(a === b); // true

惰性單例

  var createLogin = (function(){
            var div;
            if(!div){
                div = document.createElement('div');
                div.innerHTML = '登錄框';
                div.style.display = 'none';
                document.body.appendChild(div);

            }
            return div;
        })();

        document.getElementById('loginBtn').onclick = function(){
            var loginLayer = createLogin();
            loginLayer.style.display = 'block';
        }

上面的代碼還存在一些問題,例如違反了單一職責(zé),如果我們下次需要?jiǎng)?chuàng)建的不是div,而是script或者iframe什么的,只能把createLogin重新復(fù)制一份出來
下面我們把管理單例的邏輯抽離出來,這些邏輯被單獨(dú)封裝在getSingle函數(shù)內(nèi)部,創(chuàng)建對(duì)象的方法fn被當(dāng)成參數(shù)動(dòng)態(tài)傳入getSingle函數(shù)

  var getSingle = function(fn){
            var result;
            return function(){
                return result || (result = fn.apply(this,arguments));
            }
        };

        var createLogin = (function(){
            div = document.createElement('div');
            div.innerHTML = '登錄框';
            div.style.display = 'none';
            document.body.appendChild(div);
            return div;
        })();

        var createSingleLogin = getSingle(createLogin);

        document.getElementById('loginBtn').onclick = function(){
            var loginLayer = createSingleLogin();
            loginLayer.style.display = 'block';
        }

//如果需要?jiǎng)?chuàng)建一個(gè)iframe 也是很方便的
        var createSingleIframe = getSingle(function(){
            var iframe = document.createElement('iframe');
            document.body.appendChild(iframe);
            return iframe;
        });

        document.getElementById('iframeBtn').onclick = function(){
            var iframeLayer = createSingleIframe();
            iframeLayer.src = 'http://www.xxx.com';
        }

getSingle可以實(shí)現(xiàn)很多函數(shù)的單例效果

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡單、最易理解的設(shè)計(jì)模式,也因?yàn)樗暮啙嵰锥?,是?xiàng)目中最...
    成熱了閱讀 4,530評(píng)論 4 34
  • 單體模式提供了一種將代碼組織為一個(gè)邏輯單元的手段,這個(gè)邏輯單元中的代碼可以通過單一變量進(jìn)行訪問。 單體模式的優(yōu)點(diǎn)是...
    JSUED閱讀 600評(píng)論 0 0
  • 1 單例模式的動(dòng)機(jī) 對(duì)于一個(gè)軟件系統(tǒng)的某些類而言,我們無須創(chuàng)建多個(gè)實(shí)例。舉個(gè)大家都熟知的例子——Windows任務(wù)...
    justCode_閱讀 1,549評(píng)論 2 9
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個(gè)類僅有一個(gè)...
    tandeneck閱讀 2,623評(píng)論 1 8
  • 關(guān)于自控的理解 自控是人類特有的能力 自控可以幫助你達(dá)到更好的狀態(tài) 需要意識(shí)到自己在做決定 當(dāng)兩個(gè)自我發(fā)生分歧的時(shí)...
    格鍋閱讀 253評(píng)論 0 0

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