工廠方法模式是簡單工廠模式的延申,他繼承了簡單工廠模式的優勢,同時還彌補了簡單工廠模式的缺陷,更好的符合開閉原則的要求,在增長新的具體產品對象時不須要對已有的系統作任何的修改。設計模式
什麼是工廠方法
工廠方法模式簡稱爲工廠模式,又可稱做虛擬構造器模式或多態工廠模式。工廠方法模式是種類建立型模式。在工廠方法模式中,工廠父類負責定義建立產品對象的公共接口,而工廠子類負責生成具體的產品對象,這樣作的目的是將產品類的實例操做延遲到工廠子類中完成,即經過工廠子類來肯定究竟應該實例化哪個具體產品類。框架
工廠方法模式是一種建立型設計模式,其在父類中提供一個建立對象的方法,容許子類決定實例化對象的類型。函數
工廠方法模式建議使用特殊的工廠方法代替對於對象構造函數的直接調用,對象仍將經過new
運算符建立, 只是該運算符改在工廠方法中調用罷了。 工廠方法返回的對象一般被稱做」產品「。spa
工廠方法優缺點
工廠方法模式是使用頻率最高的設計模式之一,是不少開源框架和API
類庫的核心模式。做爲一種建立類模式,在任何須要生成複雜對象的地方,均可以使用工廠方法模式。有一點須要注意的地方就是複雜對象適合使用工廠模式,而簡單對象,特別是只須要經過new
就能夠完成建立的對象,無需使用工廠模式。若是使用工廠模式,就須要引入一個工廠類,會增長系統的複雜度。設計
優勢
缺點
示例
工廠方法主要包含4
個類,分別是:code
產品類主要爲工廠方法提供抽象的方法具體方法由產品內部實現,然而建立者類(抽象工廠)也是同理主要負責提供建立方法具體由具體建立者類(工廠方法)內部實現。對象
類圖以下所示:blog
代碼示例繼承
// 抽象產品接口(產品類) interface Product2{ method1() : void; method2() : void; } // 具體產品一(具體產品類) class ConcreteProduct_1 implements Product2 { constructor(){} method1() { // 具體業務代碼 } method2() { // 具體業務代碼 } } // 具體產品二(具體產品類) class ConcreteProduct_2 implements Product2 { constructor(){} method1() { // 具體業務代碼 } method2() { // 具體業務代碼 } } // 抽象工廠(建立者類) abstract class Creator { public abstract createProduct(type : number) : Product; } // 具體工廠(具體建立者類) class ConcreteCreator extends Creator { constructor(){ super(); } public createProduct(type : number) : Product { let product = null; if (type === 1) { product = new ConcreteProduct_1(); } else if (type === 2) { product = new ConcreteProduct_2(); } return product; } } // 使用 const creator:Creator = new ConcreteCreator(); const myProduct:Product = creator.createProduct(1);
總結
若是你但願複用現有對象來節省系統資源,而不是每次都從新建立對象,可以使用工廠方法。在處理大型資源密集型對象時,你會常常碰到這種資源需求。在抽象工廠中能夠聲明多個抽象的工廠方法,在具體工廠中實現了這些工廠方法,這些方法能夠包含不一樣的業務邏輯,以知足產品對象的多樣化建立需求。接口
在工廠類中能夠直接調用產品類的業務方法,客戶端無須調用工廠方法建立產品對象,直接使用工廠對象便可調用所建立的產品對象中的業務方法,實現對工廠方法的隱藏。