C++ 工厂模式:构建简单计算器
C++ 工厂模式:构建简单计算器
工厂模式是一种常用的软件设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们不直接实例化对象,而是使用一个工厂类来创建对象。
以下是使用 C++ 实现一个简单计算器的工厂模式示例代码:cpp#include
using namespace std;
// 计算器接口class Calculator {public: virtual double calculate(double num1, double num2) = 0;};
// 加法计算器实现class AdditionCalculator : public Calculator {public: double calculate(double num1, double num2) { return num1 + num2; }};
// 减法计算器实现class SubtractionCalculator : public Calculator {public: double calculate(double num1, double num2) { return num1 - num2; }};
// 乘法计算器实现class MultiplicationCalculator : public Calculator {public: double calculate(double num1, double num2) { return num1 * num2; }};
// 除法计算器实现class DivisionCalculator : public Calculator {public: double calculate(double num1, double num2) { if (num2 == 0) { throw runtime_error('除数不能为零'); } return num1 / num2; }};
// 计算器工厂类class CalculatorFactory {public: static Calculator* createCalculator(const string& oper) { if (oper == '+') { return new AdditionCalculator(); } else if (oper == '-') { return new SubtractionCalculator(); } else if (oper == '*') { return new MultiplicationCalculator(); } else if (oper == '/') { return new DivisionCalculator(); } else { throw runtime_error('不支持的操作符'); } }};
int main() { double firstP, secondP; string oper;
cout << '请输入操作数1:'; cin >> firstP; cout << '请输入操作数2:'; cin >> secondP; cout << '请输入操作:'; cin >> oper;
Calculator* calculator; try { calculator = CalculatorFactory::createCalculator(oper); double result = calculator->calculate(firstP, secondP); cout << firstP << ' ' << oper << ' ' << secondP << ' = ' << result << endl; } catch (const exception& e) { cout << '发生错误:' << e.what() << endl; }
delete calculator;
return 0;}
在这个示例中,我们定义了一个 Calculator 接口,以及加法、减法、乘法和除法计算器的具体实现类。CalculatorFactory 类作为工厂类,根据输入的操作符创建对应的计算器实例。
在 main 函数中,我们通过用户输入的操作符创建相应的计算器,并调用 calculate 方法进行计算。
这种实现方式使用了工厂模式,将对象的创建过程封装在工厂类中,使得客户端代码与具体类解耦,提高了代码的可维护性和可扩展性。
注意:
- 在使用工厂模式时,需要手动释放通过工厂创建的对象,以避免内存泄漏。在示例代码中,我们在程序结束前使用
delete关键字释放了calculator对象。* 这只是一个简单的示例,实际中还需要考虑错误处理、输入验证等更多的细节。
原文地址: https://www.cveoy.top/t/topic/bxti 著作权归作者所有。请勿转载和采集!