坏的单例

var createLoginLayer = (function () {
	var div;
	return function () {
		if (!div) {
			div = document.createElement("div");
			div.innerHTML = "我是登录浮窗";
			div.style.display = "none";
			document.body.appendChild(div);
		}
		return div;
	};
})();

通用的惰性单例

上一节我们完成了一个可用的惰性单例,但是我们发现它还有如下一些问题。

  • 这段代码仍然是违反单一职责原则的,创建对象和管理单例的逻辑都放在 createLoginLayer
    对象内部。
  • 如果我们下次需要创建页面中唯一的 iframe,或者 script 标签,用来跨域请求数据,就
    必须得如法炮制,把 createLoginLayer 函数几乎照抄一遍:

抽离出通用的单例

var getSingle = function (fn) {
	var result;
	return function () {
		return result || (result = fn.apply(this, arguments));
	};
};

总结

单例模式是一种简单但非常实用的模式,特别是惰性单例技术,在合适的时候才创建对象,并且只创建唯一的一个。更奇妙的是,创建对象和管理单例的职责被分布在两个不同的方法中,这两个方法组合起来才具有单例模式的威力