在前一篇文章講解了一下簡單工廠模式,在上篇文章中,我們也講到了簡單工廠模式的缺點,就是不滿足開閉原則,這對於軟體的設計來說,是不太好的,而下面講解的工廠方法模式,正是為了彌補簡單工廠模式的缺點,也可以說是簡單工廠模式的改進版。
工廠方法模式同樣屬於類的建立型模式又被稱為多型工廠模式。工廠方法模式的意義是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系
統在不修改具體工廠角色的情況下引進新的產品。
1.抽象工廠(creator)角色工廠方法模式的核心,任何工廠類都必須實現這個介面。
2.具體工廠( concrete creator)角色具體工廠類是抽象工廠的乙個實現,負責例項化產品物件。
3.抽象(product)角色工廠方法模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。
4.具體產品(concrete product)角色工廠方法模式所建立的具體例項物件
這個例子和簡單工廠方法模式一樣,用運動作為抽象角色,足球和籃球作為具體的產品角色來講解,下面看具體**。
首先我們建立乙個抽象類sports,同時有乙個運動的方法
public inte***ce sports
然後,定義了乙個足球類和籃球類,同樣有運動方法
public class basketball implements sports
}
public class football implements sports
}
最後寫乙個工廠類,用來創造足球運動和籃球運動。
下面我們來更改簡單工廠模式的**,逐步的改為工廠方法模式。
4.1、抽象工廠介面
public inte***ce sportsfactory
這裡和簡單工廠模式不同,我們先需要乙個抽象工廠介面,然後將具體的工廠實現到具體的子類中,這樣就能夠符合開閉原則4.2、籃球具體工廠
public class basketballfactory implements sportsfactory
}
4.3、足球具體工廠public class footballfactory implements sportsfactory
}
這樣就將具體的不同產品的實現,放到了具體的工廠來實現,當我們再增加其他的具體的產品時,只需要再增加乙個具體的產品的工廠類,而不需要去改變原有的**,所以符合對擴充套件開放的思想。
public class mainclass
}
執行結果:工廠方法模式的優點在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。
基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多型工廠模式,是因為所有的具體工廠類都具有同一抽象父類。
使用工廠方法模式的另乙個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增乙個具體工廠和具體產品就可以了。這樣,系統的可擴充套件性也就變得非常好,完全符合「開閉原則」。
工廠方法模式的缺點
在新增新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷。
由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端**中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到dom、反射等技術,增加了系統的實現難度。
乙個類不知道它所需要的物件的類:在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品物件由具體工廠類建立;客戶端需要知道建立具體產品的工廠類。
乙個類通過其子類來指定建立哪個物件:在工廠方法模式中,對於抽象工廠類只需要提供乙個建立產品的介面,而由其子類來確定具體要建立的物件,利用物件導向的多型性和黎克特制代換原則,在程式執行時,子類物件將覆蓋父類物件,從而使得系統更容易擴充套件。
將建立物件的任務委託給多個工廠子類中的某乙個,客戶端在使用時可以無須關心是哪乙個工廠子類建立產品子類,需要時再動態指定,可將具體工廠類的類名儲存在配置檔案或資料庫中。
工廠方法模式與簡單工廠模式在結構上的不同不是很明顯。工廠方法類的核心是乙個抽象工廠類,而簡單工廠模式把核心放在乙個具體類上。
工廠方法模式之所以有乙個別名叫多型性工廠模式是因為具體工廠類都有共同的介面,或者有共同的抽象父類。當系統擴充套件需要新增新的產品物件時,僅僅需要新增乙個具體物件以及乙個具體工廠物件,原有工廠物件不需要進行任何修改,也
不需要修改客戶端,很好的符合了「開放-封閉」原則。
而簡單工廠模式在新增新產品物件後不得不修改工廠方法,擴充套件性不好。
工廠方法模式退化後可以演變成簡單工廠模式。
設計模式 簡單工廠 工廠方法 抽象工廠方法模式
簡介 工廠方法模式分為 簡單工廠模式 工廠方法模式 抽象工廠方法模式 簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法 static factory method 模式,但不屬於23種gof設計模式之一。簡單工廠模式是由乙個工廠物件決定建立出哪一種產品類的實 uml圖示例 public class ...
Java設計模式 工廠方法
定義乙個用於建立物件的介面,factory method將乙個類的例項化延遲到了子類。工廠方法模式的功能 工廠方法的主要功能是讓父類在不知道具體實現的情況下,完成自身的功能呼叫,而具體的實現延遲到子類來實現。實現成抽象類 工廠方法的實現中,通常父類會是乙個抽象類,裡面包含建立所需物件的抽象方法,這些...
Java設計模式 工廠方法模式
定義乙個用於建立物件的介面,讓子類決定將哪乙個類例項化。factory method 使乙個類的例項化延遲到其子類。package car inte ce public inte ce icar inte ce package car imple import car inte ce.icar in...