單例模式之es3與es6雙版本(設計模式)

2021-09-14 00:28:15 字數 1793 閱讀 5061

保證乙個類僅有以乙個例項,僅能被例項化/建立一次,並提供全域性的訪問點。

單例模式是一種重要的設計模式,有些物件我們只需要建立乙個,比如瀏覽器的window物件,模態對話方塊。實現這種設計模式其實很簡單,最重要的是在建立例項的時候,用乙個標記變數判斷例項是否已經建立。

function singleton(name)

singleton.prototype.getname = function()

singleton.getinstance = function(name)

return this.instance;

}var a = singleton.getinstance('a');

var b = singleton.getinstance('b');

alert(a === b);

點評:

該寫法不透明,使用者必須知道用singleton.getinstance獲取單例,而非通過更加通用的方法new ***方式。

var creatediv = function(html)

creatediv.prototype.init = function()

var singletondiv = (function()

return instance;

}})()

var a = singletondiv('yyh');

var b = singletondiv('yyh1');

點評:

使用**類+普通的類,使得職責分明。普通類負責實現基本功能,**類管理單例。creatediv可以直接生產乙個例項,而加上**,可以實現單例。有木有一種模組拼湊的快感,這就實現了低耦合。

在es6中,可以使用static方法代替閉包儲存單例。

class singleton 

static getinstance(name)

return singleton.instance;

}getname()

}const singletona = singleton.getinstance('yyh1');

const singletonb = singleton.getinstance('yyh2');

console.log(singletona === singletonb);

console.log(singletona.getname() === singletonb.getname());

點評:es6的靜態方法,和閉包一樣能在減少全域性變數汙染的同時,使標記變數更加長久的儲存在記憶體中不被**。

// 負責建立div的基本功能

class creatediv

init()

}// 負責管理單例

class proxysingletoncreatediv

static getinstance(name)

return proxysingletoncreatediv.instance;

}}const singletonc = new proxysingletoncreatediv('yyh1');

const singletond = new proxysingletoncreatediv('yyh2');

console.log(singletonc === singletond);

singletonc.init();

singletond.init();

ES6 類的單例模式

想想 es5 中實現類的方法 和 以及痛苦的繼承。所幸的是 es6 給我們提供了新的類的建立方式 和 繼承方式 class dbstatic getinstance return db.instance connect find const instance 1 db.getinstance ins...

es5 es6靜態方法 類 單例模式

原聲js的類,靜態方法繼承 es5中的類和靜態方法 function person name,age 原型鏈上面的屬性和方法可以被多個例項共享 person.prototype.男 person.prototype.work function 靜態方法 person.setname function...

ES6之Promise學習與實踐

1.前言 在平時的業務開發中,前端通常需要請求後台獲取資料,或者nodejs讀取檔案等等一系列的非同步操作,我們通常需要利用非同步操作的結果或者對非同步操作的結果進行處理。通常我們的解決方案是 在非同步操作成功或者失敗的 函式裡面寫方法,在非同步操作比較簡單的時候這樣寫 還是比較好理解的,當業務逐漸...