以前介紹了JS中類的單例模式,此次咱們討論下單例模式的應用。在衆多網站中,登陸框的實現方式就是一個單例,點擊一次就展現一次,因此咱們能夠在頁面加載好的時候就建立一個登陸框,點擊頁面上的登陸按鈕時,用於控制它的顯示和隱藏。javascript
代碼實現:html
這樣的問題就是,若是用戶進來後全部的操做根本沒有用到登陸,那建立登陸框這個操做就是無用的,因此改進爲當用戶點擊登陸按鈕時纔開始建立登陸框,以下:
java
如今達到了惰性的目的,但失去了單例的效果。每次點擊登陸都會建立一個登陸框,因此還要加個變量控制這個框惟一顯示:
設計模式
這裏使用了閉包,將控制變量放到閉包裏,防止全局污染,當第一次點擊時,建立並顯示登陸框,再次點擊後,再也不進行建立直接顯示。
這樣就實現了這個登陸框的惰性單例模式,可是他存在如下問題:閉包
因此有沒有一種通用的方法抽象這種模式呢?app
先不考慮建立的東西是什麼,咱們先把管理單例的代碼抽象出來,建立對象的方法當作此單例函數的參數傳入:
函數
咱們建立了一個通用的單例函數,只專一與單例相關的代碼,接受一個fn參數,將fn的執行結果存到result中,result因爲在函數閉包裏,因此不會被銷燬。未來使用時result若是是已賦值的,那麼直接返回這個單例值,這樣若是須要建立一個單例的iFrame,只須要寫一個代碼邏輯與createLoginDiv差很少的createiFrame,放到getSingle裏返回便可使用。
經過結合前一篇[JavaScript設計模式] 什麼是單例模式的學習,咱們瞭解了單例模式,尤爲以惰性單例模式這種概念,在須要的時候纔去建立對象,並且是惟一的對象。還有單一職責原則,建立對象和管理單例被放在兩個不一樣的方法中,組合起來以達到咱們想要的目的。學習