工厂方法模式(Factory Method Pattern)

非常棒的问题!你现在已经在学习设计模式中的“创建型模式”了,**工厂方法模式(Factory Method Pattern)**是最核心的创建型设计模式之一,尤其适合「面向扩展」的系统。


一句话定义

工厂方法模式:定义一个创建对象的接口,但由子类决定要实例化哪一个类,从而实现对象创建的“延迟到子类”。

通俗理解:

不要在代码中“写死”创建哪种对象,而是交给不同的“工厂子类”来决定。


为什么需要它?

如果你代码中充斥着:

if type == "dog":
    return Dog()
elif type == "cat":
    return Cat()

那扩展新类型就很痛苦:每次都要改这段代码,违反开闭原则。

✅ 工厂方法模式把“具体创建逻辑”封装起来,让你只需要扩展,而不是修改。


✅ 优点 vs ❌ 缺点

✅ 优点 ❌ 缺点
满足开闭原则:新增子类不改已有代码 每个产品都要写一个工厂类
结构清晰,职责单一 类增多
解耦调用者与具体实现 初学者可能觉得“绕”

Python 完整代码示例(宠物商店)

我们来设计一个“宠物工厂系统”,根据不同工厂生产不同宠物。


Step 1️⃣:定义产品接口(宠物)

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

Step 2️⃣:定义具体产品类

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

Step 3️⃣:定义工厂接口

class AnimalFactory(ABC):
    @abstractmethod
    def create_animal(self) -> Animal:
        pass

Step 4️⃣:实现具体工厂类

class DogFactory(AnimalFactory):
    def create_animal(self) -> Animal:
        return Dog()

class CatFactory(AnimalFactory):
    def create_animal(self) -> Animal:
        return Cat()

Step 5️⃣:客户端代码使用工厂,而不是直接创建对象

def get_pet_sound(factory: AnimalFactory):
    pet = factory.create_animal()
    print(pet.speak())

get_pet_sound(DogFactory())  # 输出: Woof!
get_pet_sound(CatFactory())  # 输出: Meow!

流程图(Mermaid)

Animal
+speak()
Dog
+speak()
Cat
+speak()
AnimalFactory
+create_animal()
DogFactory
+create_animal()
CatFactory
+create_animal()

和「简单工厂」对比

模式 谁决定创建哪个类? 满足开闭原则?
简单工厂 工厂内部 if 判断 ❌ 不满足,新增类要改代码
工厂方法 交给子类工厂创建 ✅ 满足,只扩展不修改

应用场景

应用领域 示例
UI 工厂 创建不同平台的按钮(WindowsButton、MacButton)
游戏引擎 生成不同种类的怪物
日志框架 创建文件日志/数据库日志对象
数据库驱动 创建 MySQL、SQLite、Oracle 实例

总结口诀

✅ 工厂方法模式核心是:

“调用者只依赖工厂接口,不知道也不关心具体创建的是谁”
“新增产品,只需新增子类,不动旧代码”


如果你还想,我可以帮你把这套流程换成“支付方式工厂”(微信支付/支付宝/PayPal)或“消息通知工厂”(短信/邮件/钉钉)等实战例子,帮助你更快上手!需要我继续吗?

你可能感兴趣的:(基于python的设计模型,工厂方法模式)