實(shí)現(xiàn)還是之前的例子,不過將VehicleFactor由抽象工廠變?yōu)榫唧w工廠,而具體生產(chǎn)電力類型還是汽油類型則通過傳進(jìn)來(lái)的參數(shù)利用反射技術(shù)進(jìn)行判定,以下是代碼。
Test.java public class Test { public static void main(String[] args) { Car oilCar = VehicleFactory.createCar(Car.OILCAR); Car elecCar = VehicleFactory.createCar(Car.ELECCAR); Boat oilBoat = VehicleFactory.createBoat(Boat.OILBOAT); Boat elecBoat = VehicleFactory.createBoat(Boat.ELECBOAT); oilCar.run(); elecCar.run(); oilBoat.floatage(); elecBoat.floatage(); } } 測(cè)試類,通過工廠方法分別生產(chǎn)了四種交通工具。
Car.java, Boat.java和他們的子類都沒有變,所以不再貼出來(lái)。
VehicleFactory.java public class VehicleFactory { public static Car createCar(String type){ String className = "com.matrix.factory.abstractfactory.reflect.main."+type; Object obj = null; try { obj = Class.forName(className).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } if(obj != null){ return (Car)obj; } return null; } public static Boat createBoat(String type){ String className = "com.matrix.factory.abstractfactory.reflect.main."+type; Object obj = null; try { //通過反射獲得對(duì)象 obj = Class.forName(className).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } if(obj != null){ return (Boat)obj; } return null; } }
這是較前一例子唯一變動(dòng)的地方,它不再是抽象類,它利用反射直接生成Car和Boat的具體對(duì)象。
三. 總結(jié) 個(gè)人認(rèn)為VehicleFactory的CreateCar和CreateBoat完全可以合成一個(gè)Create方法,因?yàn)樗鼈兾ㄒ坏牟煌褪欠祷仡愋?,把返回類型改成Object然后調(diào)用的時(shí)候再?gòu)?qiáng)轉(zhuǎn)應(yīng)該是一樣的,但是工廠模式所生產(chǎn)的一定要是接口,否則就不叫工廠模式,不知道用意如何。
|