工廠方法(Factory Method)模式
- 工廠方法模式是類的創建模式,其用意是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類中。
- 在工廠方法模式中,==核心的工廠類不再負責所有產品的創建,二十將具體創建工作交給子類去做。==這個核心類僅僅負責給出具體工廠必須實現的接口,而不接觸哪一個產品類被實例化這種細節。這使- 得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。
- 在Factory Method模式中,工廠類與產品類往往具有平行的等級結構,他們之間一一對應。
- 工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多態性,工廠方法模式保持了簡單工廠模式的優點,而且部分克服了它的缺點。
工廠方法模式角色
- 抽象工廠(Creator)角色
是工廠方法模式的核心,與應用程序無關。任何在模式中創建的對象的工廠類必須實現這個接口。 - 具體工廠(Concrete Creator)角色
這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,並且受到應用程序調用以創建產品對象。 - 抽象產品(Product)角色
工廠方法模式所創建的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。 - 具體產品(Concrete Product)角色
這個角色實現了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創建,他們之間一一對應。
優點:
- 一個調用者想通過工廠創建一個對象,只要知道其名稱。
- 擴展性高,如果想增加一個產品,添加一個產品類和產品工廠就可以
- 屏蔽產品的具體實現,調用者只關心產品的接口。
缺點:
每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。
應用場景:
- 客戶端不知道它所需要的對象的類。在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體產品對象由具體工廠類創建,可將具體工廠類的類名存儲在配置文件或數據庫中。
- 抽象工廠類通過其子類來指定創建哪個對象。在工廠方法模式中,對於抽象工廠類只需要提供一個創建產品的接口,而由其子類來確定具體要創建的對象,利用面向對象的多態性和里氏代換原則,在程序運行時子類對象將覆蓋父類對象,從而使得系統更容易擴展。
實現:
UML
public interface Factory {
public Product factoryMethod();
}
public class ConcreteFactory implements Factory {
public Product factoryMethod() {
return new ConcreteProduct();
}
Factory factory;
factory = new ConcreteFactory();
Product product;
product= factory.factoryMethod();