概念:工廠模式的定義:提供創建物件的接口,意思是根據領導(調用者)的指示(參數),生產相應的產品(物件)。
建立一個物件常常需要複雜的過程,所以不適合在一個複雜的物件中。
建立物件可能會導致大量的重複程式碼,也可能提供不了足夠層級的抽象。
工廠就是把成員對象的創建工作轉交給一個外部對象,好處在於消除對象之間的耦合(也就是相互影響)
分類:
簡單工廠模式:使用一個類,通常為單體,來產生實例。
複雜工廠模式定義是:將其成員物件的實列化推到子類別中,子類別可以重寫父類別介面方法以便建立的時候指定自己的物件類型。
父類別只對創建過程中的一般性問題進行處理,這些處理會被子類別繼承,子類別之間是相互獨立的,具體的業務邏輯會放在子類別中進行編寫。
程式碼實作:
#簡單工廠模式:
var XMLHttpFactory =function(){}; //这是一个简单工厂模式 XMLHttpFactory.createXMLHttp =function(){ var XMLHttp = null; if (window.XMLHttpRequest){ XMLHttp = new XMLHttpRequest() }else if (window.ActiveXObject){ XMLHttp = new ActiveXObject("Microsoft.XMLHTTP") } return XMLHttp; } //XMLHttpFactory.createXMLHttp()这个方法根据当前环境的具体情况返回一个XHR对象。 var AjaxHander =function(){ var XMLHttp = XMLHttpFactory.createXMLHttp(); ... }
複雜工廠模式:流程==》 先設計一個抽象類,這個類別不能被實例化,只能用來衍生子類,最後透過子類別的擴充實作工廠方法
var XMLHttpFactory =function(){}; //这是一个抽象工厂模式 XMLHttpFactory.prototype = { //如果真的要调用这个方法会抛出一个错误,它不能被实例化,只能用来派生子类 createFactory:function(){ throw new Error('This is an abstract class'); } } var XHRHandler =function(){}; //定义一个子类 // 子类继承父类原型方法 extend( XHRHandler , XMLHttpFactory ); XHRHandler.prototype =new XMLHttpFactory(); //把超类原型引用传递给子类,实现继承 XHRHandler.prototype.constructor = XHRHandler; //重置子类原型的构造器为子类自身 //重新定义createFactory 方法 XHRHandler.prototype.createFactory =function(){ var XMLHttp =null; if (window.XMLHttpRequest){ XMLHttp =new XMLHttpRequest(); }else if (window.ActiveXObject){ XMLHttp =new ActiveXObject("Microsoft.XMLHTTP") } return XMLHttp; }
#應用程式場景:
以下幾種情境下工廠模式特別有用:
(1)物件的建置十分複雜
(2)需要依賴特定環境建立不同實例
(3)處理大量具有相同屬性的小物件
優點:
可以實作一些相同的方法,這些相同的方法我們可以放在父類別中編寫程式碼,那麼需要實作具體的業務邏輯,那麼可以放在子類別中重寫該父類別的方法,去實作自己的業務邏輯;
也就是說有兩點:
# 1、弱化物件間的耦合,防止程式碼的重複。在一個方法中進行類別的實例化,可以消除重複性的程式碼。
2、重複性的程式碼可以放在父類別去寫,子類別繼承於父類別的所有成員屬性和方法,子類別只專注於實作自己的業務邏輯。
缺點:
當工廠增加到一定程度的時候,提升了程式碼的複雜度,可讀性下降。而且沒有解決物件的辨識問題,也就是怎麼知道一個物件的類型。
以上是javascript設計模式之工廠模式的定義、分類、用法實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!