javascript工廠模式-XHR工廠

s3398900.jpg

一個類或對象中往往包括別的對象。在創建這種成員對象時,你可能習慣于使用常規方式,即用new關鍵字和類構造函數。問題是這樣會導致兩個類之間產生依賴性。通過工廠模式可以消除類之間的依賴關系,他使用一個方法來決定究竟要實例化哪個類。參照上圖那本書,第7章內容

XHR工廠
 var AjaxHandler = new Interface('AjaxHandler', ['request', 'createXhrObject']);

/* SimpleHandler class. */

var SimpleHandler = function() {}; // implements AjaxHandler
SimpleHandler.prototype = {
  //request函數負責執行發出的請求和處理相應結果所需的一系列操作
  //他先使用createXhrObject()函數并對其進行配置,然后發送請求
  request: function(method, url, callback, postVars) {
    //首次運行或者是沒有獲得XHR對象時執行具體的方法。
    //一旦獲取了XHR對象,就會緩存起來,后續執行直接從變量引用中獲取XHR對象
    var xhr = this.createXhrObject();
    xhr.onreadystatechange = function() {
      if(xhr.readyState !== 4) return;
      (xhr.status === 200) ? 
        callback.success(xhr.responseText, xhr.responseXML) : 
        callback.failure(xhr.status);
    };
    xhr.open(method, url, true);
    if(method !== 'POST') postVars = null;
    xhr.send(postVars);
  },
  //createXhrObject()這個工廠方法根據當前具體環境返回一個XHR對象
  //首次執行時,他會依次嘗試執行三種用于創建XHR對象的方法,一旦遇到
  //管用的,他就會返回所創建的對象,同時把自己也改為返回的那個對象
  createXhrObject: function() { //工廠方法.
    var methods = [//三種創建XHR對象的方法組成數組
      function() { return new XMLHttpRequest(); },
      function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
      function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
    ];
    //下面遍歷數組方法,嘗試獲得XHR對象
    for(var i = 0, len = methods.length; i < len; i++) {
      try {
        methods[i](); //嘗試獲得XHR對象
      }
      catch(e) {
        continue;
      }
      // If we reach this point, method[i] worked.
      //如果運行到這里,數組中有方法可以創建XHR對象
      this.createXhrObject = methods[i]; //直接把對象給第一種可以獲取
//對象的方法,緩存起來      
        return methods[i];
    }
    
    // If we reach this point, none of the methods worked.
    //如果運行到這里,表示沒有方法可以使用,拋出錯誤
    throw new Error('SimpleHandler: Could not create an XHR object.');
  } 
};

/* Usage. 具體的使用方法*/

var myHandler = new SimpleHandler(); //看不到工廠化的過程
var callback = { 
  success: function(responseText) { alert('Success: ' + responseText); }, 
  failure: function(statusCode) { alert('Failure: ' + statusCode); } 
};
myHandler.request('GET', 'script.php', callback);

createXhrObject()這個函數就是對象工廠方法,由于需要考慮到不同瀏覽器對于ajax對象的差異性,在獲取XHR對象是有根據不同的條件來進行。但是這個根據不同條件實例化XHR對象的方法和實際的ajax請求方法是兩個獨立的過程。所以在這里把實例化XHR對象的過程封裝到一個對象工廠里。在ajax方法中只需要使用XHR對象就可以了。

兩個獨立的對象之間實現了解耦和。其實在js模式設計中每種模式基本都是圍繞功能的解耦和來展開。要解決問題首先要簡化問題,在簡化過程中才能識別出模式。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,984評論 1 15
  • 接觸前端兩三個月的時候,那時候只是聽說設計模式很重要,然后我就去讀了一本設計模式的書,讀了一部分,也不知道這些設計...
    艱苦奮斗的侯小憨閱讀 3,101評論 2 39
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評論 18 399
  • 工廠模式類似于現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,854評論 2 17
  • 很多愛情總是在不經意間莫名就錯過了,而我與你之間似乎永遠隔著一個世界。你在春天聽葉落,我在秋天等花開。你在...
    玉黽山人閱讀 636評論 0 0