單例模式在面向對象的編程范式下還是非常有用的啥纸。
舉個例子喜喂,將服務化的思想引入前端,可以把一些公共邏輯以服務的模式提供薪者。把服務做成單例纵苛,在概念理解和代碼維護上能帶來很大的方便。
不過JavaScript言津,就算是ES6攻人,也沒有關于單例的比較優(yōu)雅的寫法,這點比Swift要差很多悬槽。網(wǎng)上有文章介紹怎么寫怀吻,下面這篇就很不錯。
用ES6重寫《JavaScript Patterns》中的設計模式
用立即執(zhí)行實現(xiàn)
用ES6重寫《JavaScript Patterns》中的設計模式
let __instance = (function () {
let instance;
return (newInstance) => {
if (newInstance) instance = newInstance;
return instance;
}
}());
class Singleton {
constructor() {
if (__instance()) return __instance();
//按自己需求實例化
this.foo = 'bar';
__instance(this);
}
}
let s1 = new Singleton();
let s2 = new Singleton();
console.log(s1.foo); //'bar'
console.log(s1 === s2); //true
優(yōu)點:和普通類一樣用new
關鍵字創(chuàng)建對象初婆,但是始終只有一個對象蓬坡,是事實上的單例模式。
缺點:全局函數(shù)__instance
以及函數(shù)內部變量instance
游離在類之外
用靜態(tài)函數(shù)實現(xiàn)
怎么使用es6 的class 優(yōu)雅地寫出單例模式磅叛?
class Singleton {
static getInstance() {
if (! Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
}
let s1 = Singleton.getInstance();
let s2 = Singleton.getInstance();
console.log(s1 === s2); //true
優(yōu)點:單例對象保存在一個靜態(tài)變量中屑咳,獲取對象的方式是靜態(tài)函數(shù)。
缺點:通過new方式創(chuàng)建的對象就不是單例了弊琴,不能阻止使用者使用非單例模式兆龙。
選哪一種?
可以說兩種方式都不錯访雪,選哪一種都可以详瑞。
第一種方式可以保持new一個實例的傳統(tǒng)方式掂林,感覺像普通實例一樣,但是實際上卻是單例坝橡。有些時候會讓人感覺很奇怪泻帮。
第二種方法,用一個靜態(tài)函數(shù)來獲取這個單例计寇,這樣意義就很明確锣杂,使用者知道,現(xiàn)在用的是單例番宁。
至于new操作元莫,就是一般的使用方法了,是互相隔離的普通實例蝶押。
用單例還是普通實例踱蠢,由使用者決定。