工厂方法模式 – 交通工具示例
工厂方法模式(Factory Method):定义一个创建对象的抽象工厂接口,让子类决定实例化哪一个类,每个具体产品对应一个具体工厂。
from abc import ABC, abstractmethod
# ==================== 产品抽象层 ====================
class Vehicle(ABC):
"""交通工具抽象基类"""
@abstractmethod
def drive(self):
pass
# ==================== 具体产品类 ====================
class Car(Vehicle):
def drive(self):
return "🚗 汽车在公路上行驶"
class Bicycle(Vehicle):
def drive(self):
return "🚲 自行车在非机动车道骑行"
class Airplane(Vehicle):
def drive(self):
return "✈️ 飞机在天空中飞行"
class Ship(Vehicle):
def drive(self):
return "🚢 轮船在海洋上航行"
# ==================== 抽象工厂层 ====================
class VehicleFactory(ABC):
"""交通工具抽象工厂 – 工厂方法的核心"""
@abstractmethod
def create_vehicle(self) –> Vehicle:
"""工厂方法,由具体工厂子类实现"""
pass
def deliver_vehicle(self) –> str:
"""工厂中还可以包含通用的业务逻辑"""
vehicle = self.create_vehicle()
return f"[交付] {vehicle.drive()}"
# ==================== 具体工厂类(每个产品对应一个工厂) ====================
class CarFactory(VehicleFactory):
def create_vehicle(self) –> Vehicle:
return Car()
class BicycleFactory(VehicleFactory):
def create_vehicle(self) –> Vehicle:
return Bicycle()
class AirplaneFactory(VehicleFactory):
def create_vehicle(self) –> Vehicle:
return Airplane()
class ShipFactory(VehicleFactory):
def create_vehicle(self) –> Vehicle:
return Ship()
# ==================== 客户端使用 ====================
def client_code(factory: VehicleFactory):
"""
客户端只依赖抽象工厂和抽象产品
新增产品时,只需新增对应的工厂类,无需修改此处代码
"""
print(factory.deliver_vehicle())
if __name__ == "__main__":
# 使用汽车工厂
print("=== 汽车生产线 ===")
client_code(CarFactory())
# 使用自行车工厂
print("\\n=== 自行车生产线 ===")
client_code(BicycleFactory())
# 使用飞机工厂
print("\\n=== 飞机生产线 ===")
client_code(AirplaneFactory())
# 使用轮船工厂
print("\\n=== 轮船生产线 ===")
client_code(ShipFactory())
运行输出
=== 汽车生产线 ===
[交付] 🚗 汽车在公路上行驶
=== 自行车生产线 ===
[交付] 🚲 自行车在非机动车道骑行
=== 飞机生产线 ===
[交付] ✈️ 飞机在天空中飞行
=== 轮船生产线 ===
[交付] 🚢 轮船在海洋上航行
模式对比:简单工厂 vs 工厂方法
| 工厂数量 | 1个总工厂 | 每个产品对应1个工厂 |
| 核心结构 | 工厂类 + if-else 判断 | 抽象工厂 + 多个具体工厂子类 |
| 开闭原则 | ❌ 新增产品需修改工厂代码 | ✅ 新增产品只需新增工厂类 |
| 复杂度 | 简单,类少 | 类数量翻倍,结构更复杂 |
| 适用场景 | 产品少且变化不大 | 产品多、经常扩展、需要灵活扩展 |
工厂方法的四个角色
💡 核心思想:把"创建什么"推迟到子类决定,父类只定义"怎么用",从而实现创建与使用分离,符合开闭原则。




