Skip to content

strawberrylazy/factory_design_pattern_course

Repository files navigation

创造者模式中工厂模式的演变

C++版本,根据需求改变代码

01_single_file

单个文件模式

02_modularization

接口实现分开

03_simple_factory

简单工厂模式

从02_modularization到03_simple_factory的主要变化和优缺点:

  1. 主要变化
  • 移除了DLL动态加载机制,改用静态工厂类
  • 将对象创建逻辑封装在ShapeFactory类中
  • 客户端代码(main.cpp)不再直接处理DLL加载,只需调用工厂方法
  1. 进化前的缺点(02_modularization)
  • 客户端需要了解DLL加载细节,违反单一职责原则
  • 创建逻辑分散在客户端代码中,难以维护
  • 添加新形状需要修改客户端代码
  • 依赖Windows API,平台相关性强
  1. 进化后的优点(03_simple_factory)
  • 封装了对象创建逻辑,客户端代码更简洁
  • 符合单一职责原则,创建和使用分离
  • 添加新形状只需修改工厂类,不修改客户端
  • 减少平台依赖性
  • 更容易进行单元测试
  1. 适用场景举例
  • 当系统需要支持多种相似对象的创建,但不想让客户端代码与具体实现耦合时
  • 当创建逻辑变得复杂,需要集中管理时
  • 当需要统一控制对象的创建过程(如缓存、权限检查等)时
  • 当需要支持跨平台时

这种进化是面向对象设计中"封装变化"原则的典型应用,将可能变化的创建逻辑封装起来,提高系统的可维护性和扩展性。

04_factory_method

工厂模式

从03_simple_factory到04_factory_method的主要变化和优缺点:

  1. 主要变化
  • 从简单工厂(静态方法)变为工厂方法(抽象类+具体工厂)
  • 每个具体产品(Circle/Rectangle)都有对应的工厂类
  • 创建逻辑分散到各个具体工厂中
  • 使用多态和继承关系
  1. 简单工厂的缺点(03_simple_factory)
  • 工厂类职责过重,违反单一职责原则
  • 添加新产品需要修改工厂类,违反开闭原则
  • 难以扩展新的产品族
  • 静态方法难以继承和重写
  1. 工厂方法的优点(04_factory_method)
  • 每个工厂只负责一个产品,符合单一职责
  • 添加新产品只需添加新工厂,不修改已有代码
  • 更容易扩展产品族
  • 支持多态,可以运行时决定使用哪个工厂
  • 更符合依赖倒置原则
  1. 适用场景举例
  • 当系统需要支持多个产品族时
  • 当创建逻辑需要更灵活地扩展时
  • 当需要运行时决定创建哪种产品时
  • 当不同产品需要不同的初始化过程时
  • 当需要框架提供扩展点时(如插件系统)

这种进化是面向对象设计中"开闭原则"的典型应用,通过抽象和多态,使系统更容易扩展而不需要修改已有代码。

05_abstract_factory

抽象工厂模式

从工厂方法到抽象工厂的主要变化:

  1. 结构变化
  • 工厂方法:每个产品一个工厂类(CircleFactory, RectangleFactory)
  • 抽象工厂:每个产品族一个工厂类(MacFactory, WindowsFactory)
  1. 关系变化
  • 工厂方法:工厂与产品是1:1关系
  • 抽象工厂:工厂与产品是1:N关系(一个工厂创建多个相关产品)
  1. 抽象层级
  • 工厂方法:针对单一产品类型抽象
  • 抽象工厂:针对产品族抽象

进化后的优点:

  1. 确保产品兼容性(如所有Mac风格组件一起工作)
  2. 简化客户端代码(客户端只需选择工厂,不关心具体产品)
  3. 更易扩展新产品族(新增风格只需添加新工厂)

进化后的缺点:

  1. 增加系统复杂度
  2. 难以支持新产品类型(如新增三角形需要修改所有工厂)

典型进化场景举例: 当系统需要:

  1. 跨平台UI组件(Windows/Mac风格控件)
  2. 数据库访问(MySQL/Oracle全套驱动)
  3. 游戏角色装备(不同风格的角色/武器/防具套装)

这种需求下,抽象工厂能确保创建的对象相互兼容,保持系统一致性。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors