一、模式定义与核心思想
工厂模式(Factory Pattern)属于创建型设计模式,其核心思想是通过一个"工厂类"来创建对象,而不是直接调用类的构造函数。这种模式将对象的实例化过程封装起来,使系统在实例化对象时能获得更高的灵活性和可扩展性。
模式类型细分:
- 简单工厂模式(静态工厂)
- 工厂方法模式(多态工厂)
- 抽象工厂模式(产品族工厂)
二、模式实现与Python特性结合
2.1 简单工厂模式
class Button:
def render(self): pass
class WindowsButton(Button):
def render(self):
return "Windows风格按钮"
class MacButton(Button):
def render(self):
return "Mac风格按钮"
class ButtonFactory:
@staticmethod
def create_button(os_type):
if os_type == "windows":
return WindowsButton()
elif os_type == "mac":
return MacButton()
raise ValueError("未知操作系统类型")
# 使用示例
button = ButtonFactory.create_button("windows")
print(button.render()) # 输出: Windows风格按钮
Python特性应用:
- 使用
@staticmethod
实现静态工厂方法 - 利用鸭子类型(Duck Typing)实现多态
2.2 工厂方法模式(更符合开闭原则)
from abc import ABC, abstractmethod
class Button(ABC):
@abstractmethod
def render(self): pass
class WindowsButton(Button):
def render(self):
return "Windows风格按钮"
class MacButton(Button):
def render(self):
return "Mac风格按钮"
class Dialog(ABC):
@abstractmethod
def create_button(self) -> Button: pass
def render(self):
button = self.create_button()
return f"渲染 {button.render()}"
class WindowsDialog(Dialog):
def create_button(self) -> Button:
return WindowsButton()
class MacDialog(Dialog):
def create_button(self) -> Button:
return MacButton()
# 客户端代码
def client_code(dialog: Dialog):
print(dialog.render())
client_code(WindowsDialog()) # 输出: 渲染 Windows风格按钮
Python特性亮点:
- 使用
abc
模块实现抽象基类 - 类型注解(Type Hints)提高代码可读性
- 符合依赖倒置原则(DIP)
2.3 抽象工厂模式(产品族创建)
class GUIFactory(ABC):
@abstractmethod
def create_button(self): pass
@abstractmethod
def create_checkbox(self): pass
class WinFactory(GUIFactory):
def create_button(self):
return WindowsButton()
def create_checkbox(self):
return WindowsCheckbox()
class MacFactory(GUIFactory):
def create_button(self):
return MacButton()
def create_checkbox(self):
return MacCheckbox()
# 客户端代码
def create_ui(factory: GUIFactory):
button = factory.create_button()
checkbox = factory.create_checkbox()
return button, checkbox
三、模式优势与适用场景
3.1 核心优势
- 解耦:将对象创建与使用分离
- 可扩展:新增产品类型时无需修改客户端代码
- 单一职责:创建逻辑集中管理
- 易于测试:可以轻松替换mock对象
3.2 典型应用场景
- 系统需要支持多种类型的产品
- 对象创建过程复杂或需要统一管理
- 需要动态选择具体实现类
- 框架需要提供扩展点(如Django的ModelAdmin)
四、Python特有实现技巧
4.1 使用类字典替代switch-case
class ButtonFactory:
_buttons = {
'windows': WindowsButton,
'mac': MacButton,
'linux': LinuxButton
}
@classmethod
def create_button(cls, os_type):
button_class = cls._buttons.get(os_type.lower())
if button_class:
return button_class()
raise ValueError(f"不支持的操作系统: {os_type}")
4.2 利用模块作为工厂
# buttons.py
def create_button(os_type):
if os_type == "windows":
return WindowsButton()
# ...
# 使用
from buttons import create_button
4.3 动态类注册机制
class PluginFactory:
plugins = {}
@classmethod
def register(cls, name):
def wrapper(plugin_class):
cls.plugins[name] = plugin_class
return plugin_class
return wrapper
@classmethod
def create(cls, name, *args, **kwargs):
return cls.plugins[name](*args, **kwargs)
@PluginFactory.register('pdf')
class PDFExporter: pass
五、性能考量与最佳实践
-
缓存策略:对于创建成本高的对象,可以在工厂中实现缓存
class DatabaseConnectionFactory: _instances = {} @classmethod def get_connection(cls, config): key = frozenset(config.items()) if key not in cls._instances: cls._instances[key] = RealDatabaseConnection(config) return cls._instances[key]
-
线程安全:在多线程环境下使用锁机制
from threading import Lock class ThreadSafeFactory: _lock = Lock() @classmethod def create(cls): with cls._lock: # 创建实例 return ExpensiveObject()
-
元类实现(高级技巧):
class AutoRegister(type): def __new__(cls, name, bases, namespace): new_class = super().__new__(cls, name, bases, namespace) if not namespace.get('abstract', False): Factory.register(name.lower(), new_class) return new_class
六、与其他模式的关系
- vs 建造者模式:工厂关注产品类型,建造者关注构造过程
- vs 单例模式:工厂可以返回单例对象
- vs 策略模式:工厂创建对象,策略使用对象
七、实战案例:Django中的工厂模式
Django的模型表单就是工厂模式的典型应用:
from django.forms import modelform_factory
# 动态创建表单类
ProductForm = modelform_factory(
Product,
fields='__all__',
widgets={'name': TextInput(attrs={'class': 'special'})}
)