工厂模式核心是将对象创建交由工厂处理以降低耦合、提升可扩展性;包含简单工厂(参数驱动)、工厂方法(子类决定实例化)和抽象工厂(创建产品族),选择取决于变化维度与一致性需求。

工厂模式的核心是把对象的创建过程从使用方剥离,交由专门的“工厂”来处理,从而降低耦合、提升可扩展性。它不直接 new 实例,而是通过统一接口获取对象,让新增类型只需改工厂内部逻辑,不牵连业务代码。
简单工厂:一个函数或类封装创建逻辑
适合类型不多、变化不频繁的场景。用一个函数或静态方法,根据参数返回不同子类实例。
- 定义基类(如 Payment)声明通用方法(如 pay())
- 实现多个子类(Alipay、WechatPay、CardPay)
- 编写工厂函数(如 create_payment(method: str) -> Payment),内部用 if/elif 或字典映射返回对应实例
- 调用方只和工厂与基类交互,完全不知道具体子类名
工厂方法:让子类决定实例化哪个类
当不同产品族需要各自独立的创建流程时适用。抽象工厂类定义创建方法,由具体子工厂实现。
- 定义抽象工厂类(PaymentFactory),声明抽象方法 create_payment()
- 为每种支付方式写具体工厂(AlipayFactory、WechatFactory),各自实现创建逻辑
- 客户端持有工厂引用,调用 factory.create_payment() 得到对象,无需关心构造细节
- 新增支付方式?只需加子工厂类 + 子产品类,不修改原有工厂或客户端
抽象工厂:创建“产品族”,而非单个产品
适用于系统需同时创建一组相关或依赖的对象(如不同操作系统的 ui 组件:Button、checkbox)。
立即学习“Python免费学习笔记(深入)”;
- 定义抽象工厂(GUIFactory)和多组抽象产品(Button、Checkbox)
- 实现具体工厂(WinFactory、MacFactory),每个都提供整套产品实例
- 客户端通过工厂统一获取配套组件,确保风格/行为一致,避免混搭出错
- 扩展新平台?只加一组具体工厂 + 对应产品实现,零侵入现有代码
选哪种取决于变化维度:类型少用简单工厂;创建逻辑差异大、需解耦工厂与产品用工厂方法;涉及多产品协作且需保证一致性,上抽象工厂。关键是把 new 的位置收拢,让对象生成变得可配置、可替换、可测试。