zoukankan      html  css  js  c++  java
  • javascript设计模式之工厂模式

     在看本文章之前,建议先看看这篇文章javascript设计模式之单体模式 ,毕竟个人感觉循序渐进的好。 

    工厂模式分为简单工厂模式和复杂工厂模式,前者是使用一个类来生成实例,通常是一个单体,后者是使用子类来决定一个成员变量是哪个类的具体实例,也就是简单工厂包含在复杂工厂之中。

    下面通过一个具体的实例来具体的说说这工厂的一二吧。

    用Ajax技术发起异步请求是现在web开发中的一个常见任务。 

     1 //implements AjaxHandler,创建一个复杂的工厂来执行Ajax的一系列流程,里面包含了两个简单工厂
     2 var SimpleHandler = function(){};
     3 
     4 SimpleHandler.prototype = {
     5 //第一个简单工厂执行Ajax的创建,请求,发送。。。等
     6     request:function(method,url,callback,postVars){
     7         var xhr = this.createXhrObject();
     8         xhr.onreadystatechange = function(){
     9             if(xhr.readyState != 4return;
    10             (xhr.status == 200? 
    11             //定义了一个全局对象callback来执行对返回参数的应用
    12             callback.success(xhr.responseText,xhr.responseXML):
    13             callback.failure(xhr.status);
    14         };
    15         xhr.open(method,url,true);
    16         if(method != "POST") postVars = null;
    17         xhr.send(postVars);
    18     },
    19 //第二个简单工厂是根据不同的情创建XHR对象,不论什么情况他都能返回一个正确的XHR对象
    20     createXhrObject:function(){
    21         var methods = [
    22             function(){return new XMLHttpRequest();},
    23             function(){return new ActiveXObject('Msxml2.XMLHttp');},
    24             function(){return new ActiveXObject('Microsoft.XMLHttp');}
    25         ];
    26         for(var i = 0; i < 3; i++){
    27             try{
    28                 methods[i]();
    29             }catch(e){
    30                 continue;
    31             }
    32             this.createXhrObject = methods[i]();
    33             return methods[i]();
    34         }
    35         throw new Error("Error!");
    36     }
    37 }
    38 

    看到这里,工厂模式大体就是对单体模式的进一步扩展和应用,上面的实例可以这样来调用:

    1 window.onload = function(){
    2     var myHandler = new SimpleHandler();
    3     var callback = {
    4         success:function(responseText,responseXML){alert("Success:" + responseXML);},
    5         failure:function(statusCode){alert("Failure" + statusCode);}
    6     };
    7     myHandler.request('GET','innerHTML.xml',callback);
    8     
    9 };//当然根据不同的情况,callback也就不同了

    通过使用工厂模式而不是使用new关键字及具体的类,可以把所有的实例代码集中到一个位置。

    使用工厂模式,你可以先创建一个抽象的父类,然后在子类中创建工厂方法,从而把成员对象的实例化推迟到更专门的子类当中,他可以有效的防止代码重复。



  • 相关阅读:
    Atitit 趋势管理之道 attilax著
    Atitit 循环处理的新特性 for...else...
    Atitit 2017年的技术趋势与未来的大技术趋势
    atitit 用什么样的维度看问题.docx 如何了解 看待xxx
    atitit prj mnrs 项目中的几种经理角色.docx
    Atitit IT办公场所以及度假村以及网点以及租房点建设之道 attilax总结
    Atitit 工具选型的因素与方法 attilax总结
    Atitit.团队文化建设影响组织的的一些原理 法则 定理 效应 p826.v4
    Atiitt 管理方面的误区总结 attilax总结
    Atitit 未来趋势把控的书籍 attilax总结 v3
  • 原文地址:https://www.cnblogs.com/chaofan/p/1643633.html
Copyright © 2011-2022 走看看