在看本文章之前,建議先看看這篇文章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關鍵字及具體的類,可以把所有的實例程式碼集中到一個位置。
使用工廠模式,你可以先創建一個抽象的父類,然後在子類中創建工廠方法,從而把成員對象的實例化推遲到更專門的子類當中,他可以有效的防止代碼重複。