抽象工厂模式与工厂方法模式的核心区别在于:前者用于创建多个产品族的对象(如跨平台的UI组件),后者仅针对单一产品等级结构(如不同品牌的鼠标)。 抽象工厂强调产品族的整体性,而工厂方法关注单一产品的扩展性。
-
设计目标差异
抽象工厂模式解决的是多系列产品的创建问题(例如同时生成Windows风格的按钮和文本框),确保产品之间的兼容性。工厂方法模式则专注于单一产品的灵活扩展(例如通过子类决定生成罗技或微软鼠标),避免修改现有代码。 -
结构复杂度对比
抽象工厂需要多个抽象产品接口(如Button、Border)和关联的具体工厂(如MacFactory、WinFactory),结构更庞大。工厂方法仅需一个产品接口和对应的工厂子类(如HamburgerFactory),结构更轻量。 -
扩展性倾斜
抽象工厂新增产品族容易(如增加Linux风格组件),但新增产品类型困难(需修改所有工厂类)。工厂方法新增产品类型容易(如新增键盘类),但无法直接支持多产品协同。 -
代码实现示例
抽象工厂的典型代码包含嵌套工厂方法(如CreateButton()
和CreateBorder()
),而工厂方法仅需单一创建方法(如createFood()
)。前者通过组合工厂方法实现多产品创建,后者独立运作。
总结:选择模式时,若需管理一组关联产品(如整套UI组件),优先用抽象工厂;若仅扩展单一产品线(如不同型号汽车),工厂方法更合适。两者本质是维度差异(横向产品族 vs 纵向产品层级)。