工廠模式:工廠方法與抽象工廠的戰爭
阿新 • • 發佈:2018-11-08
概述
什麼是工廠方法?什麼是抽象工廠?
工廠方法是指工廠生產產品,而抽象工廠是生產產品系列。例如,工廠方法是隻生產運輸工具比如馬車、公共汽車、自行車,而抽象工廠生產輪胎、螺絲釘交通工具零件。
工廠方法模式定義了一個建立物件的介面,但由子類決定例項化的類是哪一個。工廠方法讓類把例項化推遲到子類。
抽象工廠模式提供一個介面,用於建立相關或依賴物件的家族,而不需要明確指定具體類。
簡單工廠
public interface VehicleFactory { Vehicle create(); } public class BicycleFactory implements VehicleFactory { @Override public Vehicle create() { return new Bicycle(); } } public class CarriageFactory implements VehicleFactory{ public Vehicle create() { return new Carriage(); } } public class BusFactory implements VehicleFactory{ @Override public 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{ @Override public 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();
}
}
總結
工廠方法與抽象工廠各有什麼優缺點?
工廠方法一直都是圍繞著產品這一個緯度,著重考慮怎麼應對產品的變化。例如,新增一種型別的交通工具,並不要修改原始碼就能拓展成功,缺點就是工廠氾濫。
抽象工廠就是針對產品系列可拓展,例如新增某一種系列,人開著飛機去戰鬥,那麼可以交通工具汽車,可以吃榴蓮,手持導彈,可以輕鬆拓展進去。但是,弊端就是,系列工廠最開始要考慮周全,如果中途新增人還要有特定的服裝,那就會非常麻煩。對於產品拓展不足。