[转]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  !=   4 return ;
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关键字及具体的类,可以把所有的实例代码集中到一个位置。

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

转载于:https://www.cnblogs.com/monica/archive/2010/01/11/1644044.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值