JS設計模式一 單例模式

2021-08-22 15:11:35 字數 2043 閱讀 1603

單例模式也稱作為單子模式,更多的也叫做單體模式。為軟體設計中較為簡單但是最為常用的一種設計模式。

下面是維基百科對單例模式的介紹:

在應用單例模式時,生成單例的類必須保證只有乙個例項的存在,很多時候整個系統只需要擁有乙個全域性物件,才有利於協調系統整體的行為。比如在整個系統的配置檔案中,配置資料有乙個單例物件進行統一讀取和修改,其他物件需要配置資料的時候也統一通過該單例物件來獲取配置資料,這樣就可以簡化複雜環境下的配置管理。

單例模式的思路是:乙個類能返回乙個物件的引用(並且永遠是同乙個)和乙個獲得該例項的方法(靜態方法,通常使用 getinstance 名稱)。那麼當我們呼叫這個方法時,如果類持有的引用不為空就返回該引用,否者就建立該類的例項,並且將例項引用賦值給該類保持的那個引用再返回。同時將該類的建構函式定義為私有方法,避免其他函式使用該建構函式來例項化物件,只通過該類的靜態方法來得到該類的唯一例項。

對於 js 來說,巨大的靈活性使得其可以有多種方式實現單例模式,使用閉包方式來模擬私有資料,按照其思路可得:

var single = (function()

return unique;

}function construct()

return 

})();

以上,unique便是返回物件的引用,而 getinstance便是靜態方法獲得例項。construct 便是建立例項的建構函式。

可以通過 single.getinstance() 來獲取到單例,並且每次呼叫均獲取到同乙個單例。這就是 單例模式 所實現的效果。

不過,對於js來說,顯然以上循規蹈矩的方式顯得過於笨重,在不同的場景以不同的方式實現單體模式正是 js 的優勢

var singleton = 

}var t1 = singleton ;

var t2 = singleton ;

那麼很顯然的, t1 === t2 。

十分簡單,並且非常使用,不足之處在於沒有什麼封裝性,所有的屬性方法都是暴露的。對於一些需要使用私有變數的情況就顯得心有餘而力不足了。當然在對於 this 的問題上也是有一定弊端的。

其實和最初的js實現有點類似,不過是將對是否已經存在該類的例項的判斷放入建構函式內部。

function construct()

// 其他**

this.name = "nyf";

this.age="24";

construct.unique = this;

}var t1 = new construct() ;

var t2 = new construct() ;

那麼也有的, t1 === t2 。

也是非常簡單,無非就是提出乙個屬性來做判斷,但是該方式也沒有安全性,一旦我在外部修改了construct的unique屬性,那麼單例模式也就被破壞了。

對於大著 靈活 牌子的js來說,任何問題都能找到 n 種答案,只不過讓我自己去掂量孰優孰劣而已,下面就簡單的舉幾個使用閉包實現單例模式的方法,無非也就是將建立了的單例快取而已。

var single = (function()

unique = new constuct();

return unique;

})();

只要 每次講 var t1 = single; var t2 = single;即可。 與物件字面量方式類似。不過相對而言更安全一點,當然也不是絕對安全。

如果希望會用呼叫 single() 方式來使用,那麼也只需要將內部的 return 改為

return function(){

return unique;

以上方式也可以使用 new 的方式來進行(形式主義的趕腳)。當然這邊只是給了閉包的一種例子而已,也可以在 construct 中判斷單例是否存在 等等。 各種方式在各個不同情況做好選著即可。

總的來說,單例模式相對而言是各大模式中較為簡單的,但是單例模式也是較為常用並且很有用的模式。在js中尤為突出(每個物件字面量都可以看做是乙個單例麼~)。

記住,是否嚴格的只需要乙個例項物件的類(雖然js沒有類的概念),那麼就要考慮使用單例模式。

使用資料快取來儲存該單例,用作判斷單例是否已經生成,是單例模式主要的實現思路。

JS設計模式一 單例模式

單例模式也稱作為單子模式,更多的也叫做單體模式。為軟體設計中較為簡單但是最為常用的一種設計模式。下面是維基百科對單例模式的介紹 在應用單例模式時,生成單例的類必須保證只有乙個例項的存在,很多時候整個系統只需要擁有乙個全域性物件,才有利於協調系統整體的行為。比如在整個系統的配置檔案中,配置資料有乙個單...

JS設計模式 單例模式

單例模式是乙個用來劃分命名空間並將一批屬性和方法組織在一起的物件,如果它可以被例項化,那麼它只能被例項化一次。單例模式優點 並非所有的物件字面量都是單例,比如模擬資料基本結構 let cat 上面物件字面量結構是建立單例模式的方法之一,但並不是單例模式,單例模式的特點是僅被例項化一次 要實現單例模式...

JS設計模式 單例模式

理解 單例即只能例項乙個物件,無論new多少次,new出來的都是同乙個物件 這裡用了閉包儲存了instance變數,用於判斷是否已經建立了例項,建立了則直接返回,否則new乙個例項返回 單例模式 const grilfriend function let instance null return f...