如果希望自己的代碼更優雅、可維護性更高以及更簡潔,往往離不開設計模式這一解決方案。
在JS設計模式中,最核心的思想:封裝變化(將變與不變分離,確保變化的部分靈活,不變的部分穩定)。
那么來說說第一個常見的設計模式:單例模式。
單例模式保證一個類僅有一個實例,并提供一個訪問它的全局訪問方式,為了解決一個全局使用的類頻繁被創建和銷毀、占用內存的問題。
?比如,當系統中某個接口的結構已經無法滿足我們現在的業務需求,但又不能改動這個接口,因為可能原來的系統很多功能都依賴于這個接口,改動接口會牽扯到太多文件。因此應對這種場景,我們可以很快地想到可以用適配器模式來解決這個問題。 下面介紹幾種在JavaScript中常見的幾種設計模式:
1、單例模式
單例模式的定義:?保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。實現的方法為先判斷實例存在與否,如果存在則直接返回,如果不存在就創建了再返回,這就確保了一個類只有一個實例對象。 適用場景:一個單一對象。比如:彈窗,無論點擊多少次,彈窗只應該被創建一次。
class CreateUser { constructor(name) { this.name = name; this.getName(); } getName() { return this.name; }
}// 代理實現單例模式
var ProxyMode = (function() { var instance = null; return function(name) { if(!instance) { instance = new CreateUser(name); } return instance;
}})();// 測試單體模式的實例
var a = new ProxyMode("aaa");
var b = new ProxyMode("bbb");// 因為單體模式是只實例化一次,所以下面的實例是相等的console.log(a === b); //true
?ES5通過閉包?
在ES5中,可以使用閉包(函數內部返回函數被外界變量所引用,導致這個函數里面的變量無法被釋放,就構建成閉包)來保存這個類的實例。
var Singeton = (function(){var instance;function User(name,age){this.name=name;this.age=age;}return function(name,age){if(!instance){instance = new User(name,age)}return instance}
})()
?此時這個實例一旦生成,每次都是返回這個實例,且不會被修改,可以看到下面的代碼,當給 User 對象初始賦值 name:alice,age:18 時,以后再賦值便無效了,以及每次返回都是初始的實例對象。
ES6中使用類的靜態屬性
以上代碼使用ES6語法來實現,通過類的靜態屬性來保存唯一的實例對象。
class Singeton {constructor(name,age){if(!Singeton.instance){this.name = name;this.age = age;Singeton.instance = this;}return Singeton.instance;}
}
?創建方式仍然是一樣的,通過 new 關鍵字創建類的實例對象。
案例
那這樣一種設計模式在開發中實際有什么用途呢?我們試想這樣一個業務場景:訪問網站時,很久沒有操作頁面,此時授權過期,當我們點擊頁面上的任何一個地方,都會彈出一個登錄框。
那么這個登錄框,是全局唯一的,不會存在多份,也不會互相沖突,所以不需要每次都創建一份,保留初始那一份就夠了。
JavaScript設計模式之單例模式應用場景案例詳解_JavaScript_腳本之家