单例模式

示例

描述

单例模式的思想在于保证一个特定类仅有一个实例, 这意味着第二次创建一个新对象时, 应该得到于与第一次创建的对象相同

单例的实现逻辑: 用一个变量来标志是否创建过对象, 如果是, 则在下次直接返回这个已经创建好的对象.

    var obj;
    if(!obj) {
        obj = xxx;
    }
    return obj;

案例

假设有一个需求是点击登录需要弹出一个登录框. 这个登录窗在页面里总是唯一的, 不可能同时存在两个登录窗口的情况

实现

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;
    }
})();

通用的惰性单例

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

上面使用一个变量result来保存fn的计算结果. result变量因为身在闭包中, 它永远不会被销毁. 在将来的请求中, 如果result已经赋值, 那么它将返回这个值.

完善需求案例

var createLoginLayer = function() {
    var div = document.createElement('div');
    div.innerHTML = '登录窗';
    div.style.display = 'none';
    document.body.appendChild( div );
    return div;
};

var createSingleLoginLayer = getSingle( createLoginLayer );

document.getElementById('loginBtn').onclick = function() {
    var loginLayer = createSingleLoginLayer();
    loginLayer.style.display = 'block';
};

引路人
146 声望12 粉丝