[JavaScript设计模式]惰性单例模式

惰性单例模式

以前介绍了JS中类的单例模式,此次咱们讨论下单例模式的应用。在众多网站中,登陆框的实现方式就是一个单例,点击一次就展现一次,因此咱们能够在页面加载好的时候就建立一个登陆框,点击页面上的登陆按钮时,用于控制它的显示和隐藏。javascript

代码实现:html

这样的问题就是,若是用户进来后全部的操做根本没有用到登陆,那建立登陆框这个操做就是无用的,因此改进为当用户点击登陆按钮时才开始建立登陆框,以下:
java

如今达到了惰性的目的,但失去了单例的效果。每次点击登陆都会建立一个登陆框,因此还要加个变量控制这个框惟一显示:
设计模式

这里使用了闭包,将控制变量放到闭包里,防止全局污染,当第一次点击时,建立并显示登陆框,再次点击后,再也不进行建立直接显示。
这样就实现了这个登陆框的惰性单例模式,可是他存在如下问题:闭包

  1. 仍然违反了单一职责原则,管理单例和建立对象的代码放在了同一函数内部。
  2. 若是之后我想建立一个单例的表格,一个单例的iFrame,还要每次都这样重复写一遍,如法炮制

因此有没有一种通用的方法抽象这种模式呢?app

通用的单例模式

先不考虑建立的东西是什么,咱们先把管理单例的代码抽象出来,建立对象的方法当作此单例函数的参数传入:
函数

咱们建立了一个通用的单例函数,只专一与单例相关的代码,接受一个fn参数,将fn的执行结果存到result中,result因为在函数闭包里,因此不会被销毁。未来使用时result若是是已赋值的,那么直接返回这个单例值,这样若是须要建立一个单例的iFrame,只须要写一个代码逻辑与createLoginDiv差很少的createiFrame,放到getSingle里返回便可使用。
经过结合前一篇[JavaScript设计模式] 什么是单例模式的学习,咱们了解了单例模式,尤为以惰性单例模式这种概念,在须要的时候才去建立对象,并且是惟一的对象。还有单一职责原则,建立对象和管理单例被放在两个不一样的方法中,组合起来以达到咱们想要的目的。学习

相关文章
相关标签/搜索