单例模式就是指一个类只有一个实例。一般适用在只需要或者必须只有一个实例的情况。
为了实现这种情况,我们要隐藏掉类本身的构造函数,以免不小心用常规方式new出来一个新的实例。同时要对这个类的实例做判断,当需要用到实例时,要先判断这个类的实例存不存在,不存在才创建,存在了就直接返回。在java中,单例模式的实现简单明了:
1 | //单例类 |
虽然上面的实现方式还有线程安全等问题没有解决,但思路上可以窥见通过private修饰符,Java可以很轻松的实现单例模式。
而JavaScript没有private修饰符,我们是通过闭包的形式来实现了一个私有变量。具体代码如下:
1 | //单例类 |
虽然上面的方法实现了单例模式,但只是靠文档去约束使用者不要通过new的常规方式创建实例,如果有人这么做了,还是会生成有别于单一实例的新的实例:
1 | let obj3 = new Singleton(); |
所以可以在构造函数中做判断,当用 new 的方式生成新的实例时,如果已经存在实例就返回,没有就创建实例再返回。但同样的,需要有另一个私有变量来保存这个唯一实例,所以还要用到立即执行函数和闭包:
1 | let Singleton = (function(){ |
这样的方法,就将单例的限制融合进了原本的创建实例的方法,避免了不了解的人生成新的实例。