javascript工廠模式-XHR工廠

s3398900.jpg

一個(gè)類(lèi)或?qū)ο笾型▌e的對(duì)象京景。在創(chuàng)建這種成員對(duì)象時(shí)缤灵,你可能習(xí)慣于使用常規(guī)方式怠蹂,即用new關(guān)鍵字和類(lèi)構(gòu)造函數(shù)虐唠。問(wèn)題是這樣會(huì)導(dǎo)致兩個(gè)類(lèi)之間產(chǎn)生依賴(lài)性搀愧。通過(guò)工廠模式可以消除類(lèi)之間的依賴(lài)關(guān)系,他使用一個(gè)方法來(lái)決定究竟要實(shí)例化哪個(gè)類(lèi)疆偿。參照上圖那本書(shū)咱筛,第7章內(nèi)容

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

/* SimpleHandler class. */

var SimpleHandler = function() {}; // implements AjaxHandler
SimpleHandler.prototype = {
  //request函數(shù)負(fù)責(zé)執(zhí)行發(fā)出的請(qǐng)求和處理相應(yīng)結(jié)果所需的一系列操作
  //他先使用createXhrObject()函數(shù)并對(duì)其進(jìn)行配置,然后發(fā)送請(qǐng)求
  request: function(method, url, callback, postVars) {
    //首次運(yùn)行或者是沒(méi)有獲得XHR對(duì)象時(shí)執(zhí)行具體的方法杆故。
    //一旦獲取了XHR對(duì)象迅箩,就會(huì)緩存起來(lái),后續(xù)執(zhí)行直接從變量引用中獲取XHR對(duì)象
    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()這個(gè)工廠方法根據(jù)當(dāng)前具體環(huán)境返回一個(gè)XHR對(duì)象
  //首次執(zhí)行時(shí)处铛,他會(huì)依次嘗試執(zhí)行三種用于創(chuàng)建XHR對(duì)象的方法饲趋,一旦遇到
  //管用的拐揭,他就會(huì)返回所創(chuàng)建的對(duì)象,同時(shí)把自己也改為返回的那個(gè)對(duì)象
  createXhrObject: function() { //工廠方法.
    var methods = [//三種創(chuàng)建XHR對(duì)象的方法組成數(shù)組
      function() { return new XMLHttpRequest(); },
      function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
      function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
    ];
    //下面遍歷數(shù)組方法奕塑,嘗試獲得XHR對(duì)象
    for(var i = 0, len = methods.length; i < len; i++) {
      try {
        methods[i](); //嘗試獲得XHR對(duì)象
      }
      catch(e) {
        continue;
      }
      // If we reach this point, method[i] worked.
      //如果運(yùn)行到這里堂污,數(shù)組中有方法可以創(chuàng)建XHR對(duì)象
      this.createXhrObject = methods[i]; //直接把對(duì)象給第一種可以獲取
//對(duì)象的方法,緩存起來(lái)      
        return methods[i];
    }
    
    // If we reach this point, none of the methods worked.
    //如果運(yùn)行到這里龄砰,表示沒(méi)有方法可以使用盟猖,拋出錯(cuò)誤
    throw new Error('SimpleHandler: Could not create an XHR object.');
  } 
};

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

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

createXhrObject()這個(gè)函數(shù)就是對(duì)象工廠方法,由于需要考慮到不同瀏覽器對(duì)于ajax對(duì)象的差異性换棚,在獲取XHR對(duì)象是有根據(jù)不同的條件來(lái)進(jìn)行扒披。但是這個(gè)根據(jù)不同條件實(shí)例化XHR對(duì)象的方法和實(shí)際的ajax請(qǐng)求方法是兩個(gè)獨(dú)立的過(guò)程。所以在這里把實(shí)例化XHR對(duì)象的過(guò)程封裝到一個(gè)對(duì)象工廠里圃泡。在ajax方法中只需要使用XHR對(duì)象就可以了碟案。

兩個(gè)獨(dú)立的對(duì)象之間實(shí)現(xiàn)了解耦和。其實(shí)在js模式設(shè)計(jì)中每種模式基本都是圍繞功能的解耦和來(lái)展開(kāi)颇蜡。要解決問(wèn)題首先要簡(jiǎn)化問(wèn)題价说,在簡(jiǎn)化過(guò)程中才能識(shí)別出模式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末风秤,一起剝皮案震驚了整個(gè)濱河市鳖目,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缤弦,老刑警劉巖领迈,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碍沐,居然都是意外死亡狸捅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)累提,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尘喝,“玉大人,你說(shuō)我怎么就攤上這事斋陪⌒嗤剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵无虚,是天一觀的道長(zhǎng)缔赠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)友题,這世上最難降的妖魔是什么嗤堰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮咆爽,結(jié)果婚禮上梁棠,老公的妹妹穿的比我還像新娘。我一直安慰自己斗埂,他們只是感情好符糊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著呛凶,像睡著了一般男娄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漾稀,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天模闲,我揣著相機(jī)與錄音,去河邊找鬼崭捍。 笑死尸折,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的殷蛇。 我是一名探鬼主播实夹,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼粒梦!你這毒婦竟也來(lái)了亮航?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤匀们,失蹤者是張志新(化名)和其女友劉穎缴淋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泄朴,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡重抖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祖灰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仇哆。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖夫植,靈堂內(nèi)的尸體忽然破棺而出讹剔,到底是詐尸還是另有隱情,我是刑警寧澤详民,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布延欠,位于F島的核電站,受9級(jí)特大地震影響沈跨,放射性物質(zhì)發(fā)生泄漏由捎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一饿凛、第九天 我趴在偏房一處隱蔽的房頂上張望狞玛。 院中可真熱鬧软驰,春花似錦、人聲如沸心肪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)硬鞍。三九已至慧瘤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間固该,已是汗流浹背锅减。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伐坏,地道東北人怔匣。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像桦沉,于是被迫代替她去往敵國(guó)和親劫狠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式匯總 一永部、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用独泞、多...
    MinoyJet閱讀 3,922評(píng)論 1 15
  • 接觸前端兩三個(gè)月的時(shí)候,那時(shí)候只是聽(tīng)說(shuō)設(shè)計(jì)模式很重要苔埋,然后我就去讀了一本設(shè)計(jì)模式的書(shū)懦砂,讀了一部分,也不知道這些設(shè)計(jì)...
    艱苦奮斗的侯小憨閱讀 3,033評(píng)論 2 39
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法组橄,類(lèi)相關(guān)的語(yǔ)法荞膘,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法玉工,異常的語(yǔ)法羽资,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • 工廠模式類(lèi)似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情遵班,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式屠升。簡(jiǎn)單...
    舟漁行舟閱讀 7,724評(píng)論 2 17
  • 很多愛(ài)情總是在不經(jīng)意間莫名就錯(cuò)過(guò)了,而我與你之間似乎永遠(yuǎn)隔著一個(gè)世界狭郑。你在春天聽(tīng)葉落腹暖,我在秋天等花開(kāi)。你在...
    玉黽山人閱讀 609評(píng)論 0 0