C++计算器:简单工厂与工厂方法模式实例对比

0 下载量 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`的实例来创建不同类型的运算符,这样既保持了代码的可扩展性,又降低了耦合度。当需要添加新运算符时,只需要新增一个具体工厂类实现即可。 总结来说,简单工厂模式适用于创建的对象种类有限且不易扩展的情况,而工厂方法模式则更适合于对象种类较多或经常变化的场景。两者都是为了在设计中引入灵活性,提高代码的可维护性和可扩展性。通过对比这两个模式,程序员可以根据实际需求选择最合适的实现方式。