工廠模式—工廠方法與抽象工廠的戰爭
阿新 • • 發佈:2017-05-29
變化 com imp println 源碼 客戶端 font print apple
概述
什麽是工廠方法?什麽是抽象工廠?
工廠方法是指工廠生產產品,而抽象工廠是生產產品系列。例如,工廠方法是只生產運輸工具比如馬車、公共汽車、自行車,而抽象工廠生產輪胎、螺絲釘交通工具零件。
工廠方法模式定義了一個創建對象的接口,但由子類決定實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。
抽象工廠模式提供一個接口,用於創建相關或依賴對象的家族,而不需要明確指定具體類。
簡單工廠
交通工具創建者類
public interface VehicleFactory { Vehicle create(); } public class BicycleFactory implementsVehicleFactory { @Override public Vehicle create() { return new Bicycle(); } } public class CarriageFactory implements VehicleFactory{ public Vehicle create() { return new Carriage(); } } public class BusFactory implements VehicleFactory{ @Overridepublic Vehicle create() { return new Bus(); } }
產品類
public interface Vehicle { void run(); } public class Bicycle implements Vehicle { @Override public void run() { System.out.println("自行車 蹬蹬蹬"); } } public class Bus implements Vehicle{ @Overridepublic void run() { System.out.println("bus 咚咚咚"); } } public class Carriage implements Vehicle { @Override public void run() { System.out.println("馬車 撇撇撇"); } }
客戶端
public class Client { public static void main(String[] args) { VehicleFactory factory=new CarriageFactory(); Vehicle vehicle=factory.create(); vehicle.run(); } }
抽象工廠
public interface AbstractFactory { //騎的坐騎 Vehicle createVehicle(); //拿的武器 Weapon createWeapon(); //補充的糧食 Food createFood(); } class CarriageFacetory implements AbstractFactory{ @Override public Vehicle createVehicle() { return new Carriage(); } @Override public Weapon createWeapon() { return new AK47(); } @Override public Food createFood() { return new SteamedBun(); } } class BusFactory implements AbstractFactory{ @Override public Vehicle createVehicle() { return new Bus(); } @Override public Weapon createWeapon() { return new AK47(); } @Override public Food createFood() { return new Apple(); } }
騎的交通工具
public interface Vehicle { void run(); } class Bus implements Vehicle{ @Override public void run() { System.out.println("bus 咚咚咚"); } } public class Carriage implements Vehicle { @Override public void run() { System.out.println("馬車 撇撇撇"); } }
拿的武器
public interface Weapon { void shot(); } class AK47 implements Weapon{ @Override public void shot() { System.out.println("開Bus的手持ak47"); } } class Stick implements Weapon{ public void shot() { System.out.println("騎馬的拿著鐵棍!"); } }
吃的糧食
public interface Food { void eat(); } class Apple implements Food { @Override public void eat() { System.out.println("開bus的吃蘋果"); } } class SteamedBun implements Food{ @Override public void eat() { System.out.println("騎馬的吃饅頭"); } }
客戶端
public class Client { public static void main(String[] args) { AbstractFactory factory=new BusFactory(); Food f=factory.createFood(); Vehicle v=factory.createVehicle(); Weapon w=factory.createWeapon(); f.eat(); v.run(); w.shot(); } }
總結
工廠方法與抽象工廠各有什麽優缺點?
工廠方法一直都是圍繞著產品這一個緯度,著重考慮怎麽應對產品的變化。例如,新增一種類型的交通工具,並不要修改源碼就能拓展成功,缺點就是工廠泛濫。
抽象工廠就是針對產品系列可拓展,例如新增某一種系列,人開著飛機去戰鬥,那麽可以交通工具汽車,可以吃榴蓮,手持導彈,可以輕松拓展進去。但是,弊端就是,系列工廠最開始要考慮周全,如果中途新增人還要有特定的服裝,那就會非常麻煩。對於產品拓展不足。
工廠模式—工廠方法與抽象工廠的戰爭