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模式設計中每種模式基本都是圍繞功能的解耦和來展開。要解決問題首先要簡化問題,在簡化過程中才能識別出模式。