zoukankan      html  css  js  c++  java
  • 《JavaScript设计模式与开发实践》学习笔记——单例模式

    单例模式:保证每=一个类仅有一个实例,并提供一个访问它的全局访问点

    //透明的单例模式

     1 var CreateDiv=(function(){
     2     var instance;
     3 
     4     var CreateDiv=function(html){
     5         if(intstance){
     6             return instance;
     7         }
     8 
     9         this.html=html;
    10         this.init();
    11 
    12         return instance=this;
    13     }
    14 
    15     CreateDiv.prototype.init=function(html){
    16         var oDiv=document.createElement('div');
    17         div.innerHTML=html;
    18         document.body.appendChild(div);
    19     }
    20 
    21     return CreateDiv;
    22 })

    //用代理实现单例模式

    把负责实现单例的逻辑放到一个ProxyCreateDiv的类中,CreateDiv就是一个简单的类,它跟ProxyCreateDiv结合起来达到单例模式的效果

     1 var CreateDiv=function(html){
     2     this.html();
     3     this.init();
     4 };
     5 
     6 CreateDiv.prototype.init=function(){
     7     var oDiv=document.createElement('div');
     8     div.innerHTML=this.html;
     9     document.body.appendChild(oDiv);
    10 }
    11 
    12 var ProxyCreateDiv=(function(){
    13     var instance=null;
    14     return function(){
    15         if(!intstance){
    16             instance=new CreateDiv(html);
    17         }
    18         return instance;
    19     }
    20 })();
    21 
    22 var divA=ProxyCreateDiv("sven1");
    23 var divB=ProxyCreateDiv("sven2");
    24 
    25 divA===divB;//true

    //惰性单例实例:

     1 //例1:页面加载后就创建窗口,在点击按钮后就弹出窗口
     2 //缺点:1、如果用户没有点击登录,则就是浪费
     3 //2、且每次点击都会创建一个按钮
     4 
     5 //页面加载的创建窗口
     6 var createLoginLayer=(function(){
     7     var div=document.createElement("div");
     8     div.innerHTML="登录窗口" 9     dvi.style.display="none";
    10     document.body.appendChild(div);
    11 })();
    12 
    13 document.getElementById("LoginBtn").onclick=function(){
    14     div.style.display="block";
    15 }
    16 
    17 
    18 
    19 //例2:解决了第一个缺点,第二个缺点仍然存在
    20 //点击页面的按钮才创建窗口
    21 var createLoginLayer=function(){
    22     var div=document.createElement("div");
    23     div.innerHTML="登录窗口"24     dvi.style.display="none";
    25     document.body.appendChild(div);
    26     retur div;
    27 });
    28 
    29 document.getElementById("LoginBtn").onclick=function(){
    30     var loginLayer=createLoginLayer();
    31     div.style.display="block";
    32 }
    33 
    34 
    35 //例3:比较完善的方案
    36 //点击页面的按钮才创建窗口,并缓存第一次的创建
    37 var createLoginLayer=function(){
    38 
    39     var div=null;
    40     return function(){
    41         if(!div){
    42             var div=document.createElement("div");
    43             div.innerHTML="登录窗口"44             dvi.style.display="none";
    45             document.body.appendChild(div);            
    46         }
    47         return div;
    48     }
    49 })();
    50 
    51 document.getElementById("LoginBtn").onclick=function(){
    52     var loginLayer=createLoginLayer();
    53     div.style.display="block";
    54 }
  • 相关阅读:
    华为内部面试题库(20)
    华为内部面试题库(18)
    华为内部面试题库(14)
    华为内部面试题库(12)
    华为内部面试题库(16)
    华为内部面试题库(17)
    华为内部面试题库(11)
    华为内部面试题库(13)
    Windows 危险的注册表键
    逆向工程师要学什么?
  • 原文地址:https://www.cnblogs.com/CloverH/p/5584475.html
Copyright © 2011-2022 走看看