• 《javascript设计模式与开放实践》学习(五)惰性单例模式


    在JS中可以使用代理来实现单例模式。如创建唯一DIV的场景:

     var CreateDiv=function (html) {
            this.html=html;
            this.init();
        }
        CreateDiv.prototype.init=function () {
            var div=document.createElement('div');
            div.innerHTML=this.html;
            document.body.appendChild(div);
        }
    
        var ProxySingleCreateDiv=(function () {
            var instance;
            return function (html) {
                if(!instance){
                    instance=new CreateDiv(html);
                }
                return instance;
            }
        })();
    
        var a=new ProxySingleCreateDiv('sven1');
        var b=new ProxySingleCreateDiv('sven2');

    通过代理ProxySingleCreateDiv实现了创建唯一Div。它的好处就是创建Div的函数CreateDiv并不需要管是否曾经创建过该对象,一切业务逻辑交给代理来处理。

    模拟这样的场景,如果创建Div的时候不是页面加载的时候预先创建好,而是点击某个button才进行创建

         var getSingle=function (fn) {
            var result;
            return function () {
                return result||(result=fn.apply(this,arguments));//判断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=new createSingleLoginLayer();
            loginLayer.style.display='block';
        }

    这代代码最核心的就是用到了getSingle方法,里面定义的result因为在闭包中,不会被销毁。

  • 相关阅读:
    bzoj3786 星系探索
    [JSOI2008]火星人
    [NOI2005]维护数列
    [POI2008]砖块Klo
    郁闷的出纳员
    [HNOI2002]营业额统计
    [BZOJ1651][Usaco2006 Feb]Stall Reservations 专用牛棚
    [BZOJ2124]等差子序列
    [BZOJ3038]上帝造题的七分钟2
    [BZOJ1711][Usaco2007 Open]Dining吃饭
  • 原文地址:https://www.cnblogs.com/GallopingSnail/p/5918342.html
Copyright © 2020-2023  润新知