非常棒的问题!你现在已经在学习设计模式中的“创建型模式”了,**工厂方法模式(Factory Method Pattern)**是最核心的创建型设计模式之一,尤其适合「面向扩展」的系统。
工厂方法模式:定义一个创建对象的接口,但由子类决定要实例化哪一个类,从而实现对象创建的“延迟到子类”。
通俗理解:
不要在代码中“写死”创建哪种对象,而是交给不同的“工厂子类”来决定。
如果你代码中充斥着:
if type == "dog":
return Dog()
elif type == "cat":
return Cat()
那扩展新类型就很痛苦:每次都要改这段代码,违反开闭原则。
✅ 工厂方法模式把“具体创建逻辑”封装起来,让你只需要扩展,而不是修改。
✅ 优点 | ❌ 缺点 |
---|---|
满足开闭原则:新增子类不改已有代码 | 每个产品都要写一个工厂类 |
结构清晰,职责单一 | 类增多 |
解耦调用者与具体实现 | 初学者可能觉得“绕” |
我们来设计一个“宠物工厂系统”,根据不同工厂生产不同宠物。
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class AnimalFactory(ABC):
@abstractmethod
def create_animal(self) -> Animal:
pass
class DogFactory(AnimalFactory):
def create_animal(self) -> Animal:
return Dog()
class CatFactory(AnimalFactory):
def create_animal(self) -> Animal:
return Cat()
def get_pet_sound(factory: AnimalFactory):
pet = factory.create_animal()
print(pet.speak())
get_pet_sound(DogFactory()) # 输出: Woof!
get_pet_sound(CatFactory()) # 输出: Meow!
模式 | 谁决定创建哪个类? | 满足开闭原则? |
---|---|---|
简单工厂 | 工厂内部 if 判断 |
❌ 不满足,新增类要改代码 |
工厂方法 | 交给子类工厂创建 | ✅ 满足,只扩展不修改 |
应用领域 | 示例 |
---|---|
UI 工厂 | 创建不同平台的按钮(WindowsButton、MacButton) |
游戏引擎 | 生成不同种类的怪物 |
日志框架 | 创建文件日志/数据库日志对象 |
数据库驱动 | 创建 MySQL、SQLite、Oracle 实例 |
✅ 工厂方法模式核心是:
“调用者只依赖工厂接口,不知道也不关心具体创建的是谁”
“新增产品,只需新增子类,不动旧代码”
如果你还想,我可以帮你把这套流程换成“支付方式工厂”(微信支付/支付宝/PayPal)或“消息通知工厂”(短信/邮件/钉钉)等实战例子,帮助你更快上手!需要我继续吗?