抽象工厂模式 vs 工厂方法模式:3 个核心差异与 2 个典型应用场景对比 📅 2026/7/13 15:09:26 抽象工厂模式 vs 工厂方法模式3 个核心差异与 2 个典型应用场景对比在面向对象编程中创建型设计模式是解决对象实例化问题的关键工具。抽象工厂模式和工厂方法模式作为两种常用的创建型模式经常让开发者感到困惑。本文将通过清晰的对比和实际案例帮助中级开发者深入理解这两种模式的设计意图和适用边界。1. 模式定义与基本概念1.1 工厂方法模式工厂方法模式定义了一个创建对象的接口但让子类决定实例化哪个类。工厂方法让类的实例化推迟到子类进行。// 工厂方法模式示例 public interface Product { void use(); } public class ConcreteProductA implements Product { Override public void use() { System.out.println(使用产品A); } } public abstract class Creator { public abstract Product factoryMethod(); public void someOperation() { Product product factoryMethod(); product.use(); } } public class ConcreteCreatorA extends Creator { Override public Product factoryMethod() { return new ConcreteProductA(); } }1.2 抽象工厂模式抽象工厂模式提供一个接口用于创建相关或依赖对象的家族而不需要明确指定具体类。// 抽象工厂模式示例 public interface AbstractFactory { ProductA createProductA(); ProductB createProductB(); } public class ConcreteFactory1 implements AbstractFactory { Override public ProductA createProductA() { return new ProductA1(); } Override public ProductB createProductB() { return new ProductB1(); } }1.3 UML类图对比模式UML结构特点工厂方法一个抽象创建者类多个具体创建者子类每个子类负责创建一种产品抽象工厂一个抽象工厂接口多个具体工厂实现每个工厂能创建一组相关产品2. 核心差异分析2.1 设计意图不同工厂方法模式关注的是单个产品的创建它将实例化延迟到子类强调的是如何创建一个对象。抽象工厂模式关注的是产品家族的创建它强调的是如何创建一组相关的对象这些对象通常需要一起使用。2.2 结构复杂度对比工厂方法模式的结构相对简单一个产品接口/抽象类多个具体产品实现一个创建者抽象类多个具体创建者实现抽象工厂模式的结构更复杂多个产品接口/抽象类构成产品族多个具体产品实现一个抽象工厂接口多个具体工厂实现2.3 扩展性差异扩展维度工厂方法模式抽象工厂模式新增产品类型容易只需添加新的具体产品类和对应的工厂子类困难需要修改抽象工厂接口和所有具体工厂实现新增产品族不适用容易只需添加新的具体工厂实现3. 典型应用场景对比3.1 工厂方法模式最佳场景单一产品等级结构当系统只需要处理单一类型产品的创建但具体实现可能变化时工厂方法模式是最佳选择。GUI跨平台按钮示例from abc import ABC, abstractmethod class Button(ABC): abstractmethod def render(self): pass class WindowsButton(Button): def render(self): return Windows风格按钮 class MacOSButton(Button): def render(self): return MacOS风格按钮 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 MacOSDialog(Dialog): def create_button(self) - Button: return MacOSButton()3.2 抽象工厂模式最佳场景产品族创建当需要创建一组相关或依赖的对象时抽象工厂模式展现出其优势。家具生产示例// 抽象产品接口 interface Chair { void sitOn(); } interface Sofa { void lieOn(); } // 具体产品 class ModernChair implements Chair { public void sitOn() { System.out.println(坐在现代风格椅子上); } } class VictorianChair implements Chair { public void sitOn() { System.out.println(坐在维多利亚风格椅子上); } } // 抽象工厂 interface FurnitureFactory { Chair createChair(); Sofa createSofa(); } // 具体工厂 class ModernFurnitureFactory implements FurnitureFactory { public Chair createChair() { return new ModernChair(); } public Sofa createSofa() { return new ModernSofa(); } } class VictorianFurnitureFactory implements FurnitureFactory { public Chair createChair() { return new VictorianChair(); } public Sofa createSofa() { return new VictorianSofa(); } }4. 模式选择决策指南在实际项目中如何选择这两种模式以下决策树可以帮助你做出选择你的系统是否需要创建多个相关产品对象是 → 考虑抽象工厂模式否 → 进入下一步你是否需要控制单个产品的创建过程是 → 使用工厂方法模式否 → 考虑简单工厂或直接new提示两种模式可以结合使用。一个抽象工厂中的方法可以实现为工厂方法这样既能保持产品族的一致性又能灵活控制单个产品的创建过程。5. 实际项目中的经验分享在多年的企业级应用开发中我发现抽象工厂模式特别适合以下场景UI主题系统需要确保所有UI组件风格一致数据库访问层需要保证连接、命令、适配器等对象来自同一数据库供应商跨平台应用开发确保同一平台的UI控件风格一致而工厂方法模式则在插件式架构中表现优异当需要动态加载和实例化不同类型的插件时工厂方法提供了完美的解决方案。一个常见的误区是过度设计——不是所有情况都需要使用抽象工厂。如果产品之间没有强制的关联关系使用工厂方法或简单工厂可能更合适。记住模式的复杂度应该与问题的复杂度相匹配。