javascript設計模式學習——單例模式
單例模式:又被稱為單體模式,是只允許實例化一次的對象類。
運用:
1.用一個對象來規劃一個命名空間(如:JQuery庫,單例模式就為它提供了一個命名空間),井井有條地管理對象上的屬性與方法。
2.通過單例模式來管理代碼庫的各個模塊
模塊化的概念由來已久,並且在JS中也有很長久的使用歷史。通常我們在編寫代碼時,會將復雜的問題根據實際情況進行合理的拆分,讓代碼更具備可讀性與可維護性。因此一個模塊可以理解為整體的一部分。而且隨著JS應用復雜度的提高,模塊化的應用也變成了必須。
在之前的JS中,沒有專門為模塊化提供相應的語法支持,但好在我們還有閉包。因此以前我們借助自執行函數來模擬一個模塊。
var moduleDemo = (function name(params) { function bar() {}; function foo() {}; function map() {}; return { bar: bar, foo: foo, map: map, } })(); //訪問模塊內部的方法 moduleDemo.bar();
bar,foo,map三個方法在函數內部被定義,但是卻可以在外部使用。所以很簡單就能看出,我們借助閉包實現了模塊。借助這樣的思路,我們可以封裝一些工具方法組成一個單獨的工具模塊,以避免代碼的重復編寫。這樣的比較出名的實踐有
lodash
axios
等。他們都是在實踐中用得比較多的工具模塊。
模塊化是單例模式的一種實踐應用。
3.管理靜態變量
靜態變量特點: 只能訪問不能修改,創建後就能使用
---js實現方法,定義在函數內部,只能通過特權方法訪問,不提供賦值變量的方法,只提供獲取變量的方法
而為了實現創建後就能訪問,就讓創建的函數執行一次,此時,我們創建的對象內保存靜態變量通過取值器訪問,最後將這個對象作為一個單例放在全局空間裏作為靜態變量單例對象供他人使用
(先創建好,不管需不需在內存中都會存在這個單例對象------俗稱“惡漢模式”)
代碼demo: 主要使用了一個自執行的一個閉包,自執行保證創建之後就能使用,而閉包能保護數據,數據的訪問,通過閉包返回一個取值器的方法(借助閉包實現單例模式)
var config = (function(){ var conf = { MAX_NUM : 100, MIN_NUM : 0, COUNT: 100, } return { //取值器方法 get: function (name) { return conf[name] ? conf[name] : null; } } })()
4. 惰性單例
而有些單例對象需要延遲創建,有人也稱之為“惰性創建”(如果已經創建了就直接返回,如果沒有被創建,就創建一個出來,即需要的時候進行創建---------俗稱“懶漢模式”)
//惰性載入單例 var LazySingle = (function (){ //單例實例引用 var _instance = null; //單例 function Single(){ /*這裏定義私有屬性和方法*/ return { publicMethod: function (){}, publicProperty: ‘1.0‘, } } //獲取單例對象接口 return function() { //如果不是這個單例九江創建單例模式 if (!_instance) { _instance = Single(); } return _instance; } })() console.log(LazySingle().publicProperty)
以上,可以總結出單例模式的好處:
1.定義命名空間,便於管理與維護
2.比起每次new一個對象出來,可以大大減少內存,減少對資源的占用
javascript設計模式學習——單例模式