前面學(xué)習(xí)了簡單工廠模式(簡單工廠模式的學(xué)習(xí)),簡單工廠模式存在很多問題。經(jīng)過實踐,業(yè)界針對其違反開閉原則的缺點進行改進,有了工廠方法模式。
工廠方法模式:又稱工廠模式、多態(tài)工廠模式和虛擬構(gòu)造器模式,通過定義工廠父類負責(zé)定義創(chuàng)建對象的公共接口,而子類則負責(zé)生成具體的對象。
二、實現(xiàn)示例2.1 UML類圖
以生產(chǎn)汽車為例,將汽車制造工廠定義為一個公共接口CarFactory,分別由BaoMa生產(chǎn)工廠類于BenChi生產(chǎn)工廠類各自實現(xiàn),各自的工廠通過對應(yīng)汽車的構(gòu)造方法來創(chuàng)建對應(yīng)的汽車實例。
UML類圖
2.2 具體代碼
2.2.1 汽車產(chǎn)品的定義與實現(xiàn)
汽車接口
public interface Car { void showBrand();}
兩個具體實現(xiàn)類
public class BaoMa implements Car{ @Override public void showBrand() { System.out.println("this car's brand is BaoMa!"); }}
public class BenChi implements Car{ @Override public void showBrand() { System.out.println("this car's brand is BenChi!"); }}
工廠接口及其實現(xiàn)類
public interface CarFactory { Car produceCar();}
public class BaoMaFactory implements CarFactory{ @Override public Car produceCar() { System.out.println("由寶馬工廠制造具體的寶馬汽車"); return new BaoMa(); }}
public class BenChiFactory implements CarFactory{ @Override public Car produceCar() { System.out.println("由奔馳工廠制造具體的奔馳汽車"); return new BenChi(); }}
使用代碼:
public class FactoryMethodTest { public static void main(String[] args) { BaoMaFactory baoMaFactory = new BaoMaFactory(); Car baoma = baoMaFactory.produceCar(); baoma.showBrand(); System.out.println("==============================="); BenChiFactory benChiFactory = new BenChiFactory(); Car benchi = benChiFactory.produceCar(); benchi.showBrand(); }}
運行結(jié)果:
控制臺輸出
三、優(yōu)缺點分析優(yōu)點:
(1)更符合開閉原則
(2)符合單一職責(zé)原則
(3)讓擴展變得簡單,讓繼承變得可行,增加了多態(tài)性的體現(xiàn)
缺點:
(1)新增加產(chǎn)品類時,還需要增加與之對應(yīng)的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜度;
(2)需要引入抽象層,增加了系統(tǒng)的抽象性和理解難度。
四、實際應(yīng)用(1)JDK中的Collection接口