C++版本,根据需求改变代码
单个文件模式
接口实现分开
简单工厂模式
从02_modularization到03_simple_factory的主要变化和优缺点:
- 主要变化 :
- 移除了DLL动态加载机制,改用静态工厂类
- 将对象创建逻辑封装在ShapeFactory类中
- 客户端代码(main.cpp)不再直接处理DLL加载,只需调用工厂方法
- 进化前的缺点(02_modularization) :
- 客户端需要了解DLL加载细节,违反单一职责原则
- 创建逻辑分散在客户端代码中,难以维护
- 添加新形状需要修改客户端代码
- 依赖Windows API,平台相关性强
- 进化后的优点(03_simple_factory) :
- 封装了对象创建逻辑,客户端代码更简洁
- 符合单一职责原则,创建和使用分离
- 添加新形状只需修改工厂类,不修改客户端
- 减少平台依赖性
- 更容易进行单元测试
- 适用场景举例 :
- 当系统需要支持多种相似对象的创建,但不想让客户端代码与具体实现耦合时
- 当创建逻辑变得复杂,需要集中管理时
- 当需要统一控制对象的创建过程(如缓存、权限检查等)时
- 当需要支持跨平台时
这种进化是面向对象设计中"封装变化"原则的典型应用,将可能变化的创建逻辑封装起来,提高系统的可维护性和扩展性。
工厂模式
从03_simple_factory到04_factory_method的主要变化和优缺点:
- 主要变化 :
- 从简单工厂(静态方法)变为工厂方法(抽象类+具体工厂)
- 每个具体产品(Circle/Rectangle)都有对应的工厂类
- 创建逻辑分散到各个具体工厂中
- 使用多态和继承关系
- 简单工厂的缺点(03_simple_factory) :
- 工厂类职责过重,违反单一职责原则
- 添加新产品需要修改工厂类,违反开闭原则
- 难以扩展新的产品族
- 静态方法难以继承和重写
- 工厂方法的优点(04_factory_method) :
- 每个工厂只负责一个产品,符合单一职责
- 添加新产品只需添加新工厂,不修改已有代码
- 更容易扩展产品族
- 支持多态,可以运行时决定使用哪个工厂
- 更符合依赖倒置原则
- 适用场景举例 :
- 当系统需要支持多个产品族时
- 当创建逻辑需要更灵活地扩展时
- 当需要运行时决定创建哪种产品时
- 当不同产品需要不同的初始化过程时
- 当需要框架提供扩展点时(如插件系统)
这种进化是面向对象设计中"开闭原则"的典型应用,通过抽象和多态,使系统更容易扩展而不需要修改已有代码。
抽象工厂模式
从工厂方法到抽象工厂的主要变化:
- 结构变化 :
- 工厂方法:每个产品一个工厂类(CircleFactory, RectangleFactory)
- 抽象工厂:每个产品族一个工厂类(MacFactory, WindowsFactory)
- 关系变化 :
- 工厂方法:工厂与产品是1:1关系
- 抽象工厂:工厂与产品是1:N关系(一个工厂创建多个相关产品)
- 抽象层级 :
- 工厂方法:针对单一产品类型抽象
- 抽象工厂:针对产品族抽象
进化后的优点:
- 确保产品兼容性(如所有Mac风格组件一起工作)
- 简化客户端代码(客户端只需选择工厂,不关心具体产品)
- 更易扩展新产品族(新增风格只需添加新工厂)
进化后的缺点:
- 增加系统复杂度
- 难以支持新产品类型(如新增三角形需要修改所有工厂)
典型进化场景举例: 当系统需要:
- 跨平台UI组件(Windows/Mac风格控件)
- 数据库访问(MySQL/Oracle全套驱动)
- 游戏角色装备(不同风格的角色/武器/防具套装)
这种需求下,抽象工厂能确保创建的对象相互兼容,保持系统一致性。