单体对象都是在脚本加载时被创建出来。如下代码:
var Singleton = (function() { // 普通的单体模式 // code here return { }; })();
而对于资源密集型的或配置开销甚大的单体,也许更合理的做法是将其实例化推迟到需要使用它的时候。这种技术被称为“惰性加载(lazyloading)”,它最常用于那些必须加载大量数据的单体。而那些被用作命名空间,特定网页专用代码包装器或组织相关实用方法的工具的单体最好立即实例化。
这种惰性加载单体的特别之处在于,对它们的访问必须借助于一个静态方法。应该这样调用其方法:Singleton.getInstance().methodName(),而不是这样调用:Singleton.methodName()。getInstance方法会检查该单体是否已经被实例化。如果还没有,那么它将创建并返回其实例。若单体已经被实例化过,那么它将返回现有实例。
对比普通的单体模式和惰性加载的单体模式:
var Singleton = (function() { // 惰性加载的单体模式 var uniqueInstance = null; function constructor() { // code here return { }; } return { getInstance : function() { if(!uniqueInstance) { uniqueInstance = constructor(); } return uniqueInstance; } }; })();