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