文章目录
- 代码示例
- 工厂的作用
- 1. 对象创建的封装 🏭
- 2. 解耦客户端和具体类 🔗
- 3. 统一的创建入口 🚪
- 4. 隐藏实现细节 🎭
- 在这个项目中的具体体现
- 总结
代码示例
https://gitee.com/arnold_s/my-learning-test/tree/master/20250610_C++_design_pattern/23_GoF_Design_Patterns/02_Strategy
工厂的作用
1. 对象创建的封装 🏭
TaxStrategy* NewStrategy() {if (country == "CN") {return new CNTax();} else if (country == "US") {return new USTax();} else if (country == "DE") {return new DETax();} else if (country == "FR") {return new FRTax();}
}
- 工厂把创建对象的复杂逻辑封装起来
- 客户端不需要知道具体创建哪个类的实例
- 只需要告诉工厂"我要什么",工厂负责"怎么创建"
2. 解耦客户端和具体类 🔗
没有工厂的情况:
// 客户端需要直接决定创建哪个策略
TaxStrategy* strategy;
if (country == "CN") {strategy = new CNTax(); // 客户端直接依赖具体类
} else if (country == "US") {strategy = new USTax();
}
// ... 复杂的判断逻辑
有工厂的情况:
// 客户端只需要调用工厂
StrategyFactory factory(country);
TaxStrategy* strategy = factory.NewStrategy(); // 简洁!
3. 统一的创建入口 🚪
- 所有税收策略的创建都通过同一个工厂
- 便于统一管理和维护
- 如果要添加新的税收策略(比如日本税收),只需要在工厂里添加一个分支
4. 隐藏实现细节 🎭
- 客户端不需要知道:
- 有哪些具体的税收策略类
- 每个策略类的构造函数参数
- 创建对象的复杂逻辑
- 工厂对外提供统一的接口
在这个项目中的具体体现
// main.cpp 中的使用
StrategyFactory factory(country.first); // 告诉工厂国家代码
SalesOrder order(&factory, context); // SalesOrder内部调用工厂创建策略
// SalesOrder 构造函数中
this->strategy = strategyFactory->NewStrategy(); // 简单调用,无需复杂判断
总结
工厂模式的核心作用是:把"创建什么对象"的决策权从客户端转移到工厂,实现创建逻辑的集中管理和封装。这样代码更清晰、更容易维护,也更符合"开闭原则"(对扩展开放,对修改关闭)。
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ