C++计算器:简单工厂与工厂方法模式实例对比
199 浏览量
更新于2024-08-29
收藏 95KB PDF 举报
在C++设计模式编程中,简单工厂模式与工厂方法模式是两种常见的创建型设计模式,它们都用于在运行时根据需求动态创建对象,但各自的特点和应用场景有所不同。本文将通过一个计算器实现的例子来对比这两种模式。
首先,我们来看看简单工厂模式。在这个例子中,我们创建了一个名为`COperationFactory`的工厂类,它包含一个静态方法`NewOperation`。这个方法接收一个字符串参数`strOperate`,代表运算符类型(如"add", "sub", "mul", "div")。根据`strOperate`的值,工厂方法返回相应的运算符子类(如`COperationAdd`, `COperationSub`, `COperationMul`, 或 `COperationDiv`)的实例。例如:
```cpp
static COperation* NewOperation(const string& strOperate)
{
if (strOperate == "add") {
return new COperationAdd();
} else if (strOperate == "sub") {
return new COperationSub();
} else if (strOperate == "mul") {
return new COperationMul();
} else if (strOperate == "div") {
return new COperationDiv();
}
// 其他错误处理或默认情况
return nullptr;
}
```
简单工厂模式的主要优点是它隐藏了对象的具体创建过程,客户端无需关心对象的实现细节,只需知道如何通过工厂方法获取所需的运算符对象。然而,如果运算符类型过多或者将来需要扩展新的运算符,就需要在工厂类中添加额外的if-else语句,这可能会导致代码冗余和维护困难。
相比之下,工厂方法模式(也称为策略模式的一种变体)更加灵活。在这种模式中,我们通常有一个抽象的工厂类,它定义了一组创建产品的方法,但不指定具体的产品类。然后,每个具体的产品类都有自己的创建实例的方法,这样可以避免在工厂类中进行条件判断。例如,我们可以创建一个`IOperationFactory`接口,让各个运算符子类实现:
```cpp
class IOperationFactory {
public:
virtual ~IOperationFactory() {}
virtual COperation* CreateOperation(const string& strOperate) = 0;
};
class AddOperationFactory : public IOperationFactory {
public:
COperation* CreateOperation(const string& strOperate) override {
return new COperationAdd();
}
};
// ... 其他运算符工厂类实现
```
客户端不再直接使用`COperationFactory`,而是通过`IOperationFactory`的实例来创建不同类型的运算符,这样既保持了代码的可扩展性,又降低了耦合度。当需要添加新运算符时,只需要新增一个具体工厂类实现即可。
总结来说,简单工厂模式适用于创建的对象种类有限且不易扩展的情况,而工厂方法模式则更适合于对象种类较多或经常变化的场景。两者都是为了在设计中引入灵活性,提高代码的可维护性和可扩展性。通过对比这两个模式,程序员可以根据实际需求选择最合适的实现方式。
2022-06-04 上传
2014-10-18 上传
2012-10-12 上传
2023-06-22 上传
2024-06-24 上传
2023-07-13 上传
2023-06-19 上传
2023-07-01 上传
2023-09-03 上传
weixin_38615591
- 粉丝: 5
- 资源: 977
最新资源
- Python中快速友好的MessagePack序列化库msgspec
- 大学生社团管理系统设计与实现
- 基于Netbeans和JavaFX的宿舍管理系统开发与实践
- NodeJS打造Discord机器人:kazzcord功能全解析
- 小学教学与管理一体化:校务管理系统v***
- AppDeploy neXtGen:无需代理的Windows AD集成软件自动分发
- 基于SSM和JSP技术的网上商城系统开发
- 探索ANOIRA16的GitHub托管测试网站之路
- 语音性别识别:机器学习模型的精确度提升策略
- 利用MATLAB代码让古董486电脑焕发新生
- Erlang VM上的分布式生命游戏实现与Elixir设计
- 一键下载管理 - Go to Downloads-crx插件
- Java SSM框架开发的客户关系管理系统
- 使用SQL数据库和Django开发应用程序指南
- Spring Security实战指南:详细示例与应用
- Quarkus项目测试展示柜:Cucumber与FitNesse实践