工廠模式核心意圖:為創建對象提供過渡接口,將實例化邏輯屏蔽隔離,提高系統靈活性。GoF 將其分為工廠方法與抽象工廠兩類,業界常補充簡單工廠作為特例。
結構:工廠類(核心邏輯判斷)+ 抽象產品 + 具體產品
特點:一個具體工廠類決定創建哪個產品,違反開閉原則,新增產品需修改工廠代碼。適用於產品種類固定、較少的場景。
核心改進:引入抽象工廠角色,將實例化決策延遲到子類:
// 抽象產品
public interface Moveable { void run(); }
// 具體產品
public class Plane implements Moveable { public void run() { System.out.println("plane"); } }
public class Broom implements Moveable { public void run() { System.out.println("broom"); } }
// 抽象工廠
public abstract class VehicleFactory { abstract Moveable create(); }
// 具體工廠
public class PlaneFactory extends VehicleFactory { public Moveable create() { return new Plane(); } }
public class BroomFactory extends VehicleFactory { public Moveable create() { return new Broom(); } }
// 客戶端
VehicleFactory factory = new BroomFactory();
Moveable m = factory.create(); m.run();
優勢:符合開閉原則,新增產品只需新增工廠子類,無需修改現有代碼。劣勢:產品種類多時類爆炸,可結合簡單工廠合並同類產品。
解決問題:多個產品等級結構(如 Vehicle、Weapon、Food),需創建相關/依賴對象族:
public abstract class AbstractFactory {
public abstract Vehicle createVehicle();
public abstract Weapon createWeapon();
public abstract Food createFood();
}
public class DefaultFactory extends AbstractFactory {
public Vehicle createVehicle() { return new Car(); }
public Weapon createWeapon() { return new AK47(); }
public Food createFood() { return new Apple(); }
}
關鍵差異:工廠方法針對「單一產品等級」,抽象工廠針對「多產品等級構成的產品族」。單產品族時退化為工廠方法。
| 維度 | 簡單工廠 | 工廠方法 | 抽象工廠 |
|---|---|---|---|
| 工廠類型 | 具體類 | 抽象類/接口 | 抽象類/接口 |
| 產品結構 | 單一等級 | 單一等級 | 多等級(族) |
| 擴展性 | 差(修改工廠) | 好(新增子類) | 好(新增族) |
| 適用場景 | 產品固定少 | 單產品多變體 | 產品族一致性 |
理解三者演進脈絡,本質是將「創建什麼」與「如何創建」解耦的不斷深化過程。