以下是四种创建型设计模式的对比表格,从核心思想、结构、适用场景、优缺点等维度进行对比:
对比维度 | 简单工厂模式 | 工厂方法模式 | 抽象工厂模式 | 创建者模式(Builder) |
---|---|---|---|---|
核心思想 | 集中创建单一类型对象 | 延迟到子类创建对象 | 创建一系列相关对象 | 分步骤构建复杂对象 |
结构复杂度 | ★☆☆(简单) | ★★☆(中等) | ★★★(复杂) | ★★★(复杂) |
工厂角色 | 单一工厂类 | 抽象工厂+具体工厂子类 | 抽象工厂+具体工厂实现 | 指导者(Director)+建造者(Builder) |
产品扩展性 | 需修改工厂类(违反OCP) | 扩展新工厂子类(符合OCP) | 需修改抽象工厂(部分违反OCP) | 灵活扩展,不影响现有代码 |
产品关联性 | 无关联 | 无关联 | 强关联(产品族) | 可组合不同部件 |
典型场景 | 简单对象创建 | 需要扩展的产品家族 | 跨平台组件库 | 复杂对象构造(如LOL角色装备) |
客户端耦合度 | 高(直接依赖工厂) | 中(依赖抽象工厂) | 中(依赖抽象工厂) | 低(通过Director解耦) |
核心接口 | createProduct(type) | Product createProduct() | createProductA() , createProductB() | buildPartX() , getResult() |
典型代码结构 | switch-case分支 | 模板方法模式 | 多个工厂方法组合 | 链式调用+步骤分解 |
设计原则遵循 | 违反开闭原则 | 遵循开闭原则 | 部分违反开闭原则 | 完全遵循开闭原则 |
经典案例 | 日志系统(DEBUG/INFO/ERROR) | 数据库驱动(MySQL/Oracle) | 跨平台UI组件(Windows/Mac) | 文档生成器(PDF/HTML格式) |
模式对比总结:
- 简单工厂
- 优点:实现简单,适合简单场景
- 缺点:违反开闭原则,新增产品需修改工厂
- 适用:产品类型较少且稳定的场景
- 工厂方法
- 优点:符合开闭原则,扩展性好
- 缺点:增加产品需新增工厂类
- 适用:需要灵活扩展产品家族的场景
- 抽象工厂
- 优点:管理产品族,保持产品一致性
- 缺点:新增产品族需修改工厂接口
- 适用:需要跨平台/跨主题组件的场景
- 创建者模式
- 优点:解耦构造过程与表示,支持多配置
- 缺点:代码量增加,需要维护Builder类
- 适用:构建复杂对象(如LOL英雄技能组合、汽车组装)
模式演进关系:
简单工厂 → 工厂方法(解决扩展性问题)
↓
抽象工厂(解决产品族问题)
↓
创建者模式(解决复杂构造流程问题)
根据具体场景选择模式:
- 简单对象创建 → 简单工厂
- 需要扩展的产品线 → 工厂方法
- 跨平台组件 → 抽象工厂
- 复杂对象构造 → 创建者模式