本人最近在学习大话设计模式,书中的代码是C#语言,本人根据C#语言改成C++来学习。代码存在的不足或问题有望各位指出。
简单工厂模式
本文主要简单的介绍一下简单工厂模式,代码实例使用书中计算器控制台应用程序。
(1)菜鸟的编程方式:
#include <iostream>
#include <exception>
#include <string>
using namespace std;
class Operation{
public:
double getResult(double num1, double num2, char sign)
{
double result;
switch (sign)
{
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
{
if (num2 == 0)
throw exception("分母不能为零");
result = num1 / num2;
break;
}
}
return result;
}
};
int main()
{
try{
double num1;
cout << "请输入数字A:" << endl;
cin >> num1;
char sign;
cout << "请选择运算符号(+、-、*、/):" << endl;
cin >> sign;
double num2;
cout << "请输入数字B: " << endl;
cin >> num2;
Operation oper;
double result = oper.getResult(num1, num2, sign);
cout << "结果是:" << result << endl;
} catch (exception &e)
{
cout << "您的输入有误:" << e.what() << endl;
}
return 0;
}
设计模式目的是使代码变得可维护,可复用,可扩展;通过封装、继承、多态把程序的耦合度降低,使得程序更加的灵活。
(2)简单工厂模式
//此方法将numA 和numB声明为protected类型
#include <iostream>
#include <exception>
using namespace std;
class Operation
{
public:
Operation() = default;
virtual ~Operation(){}
Operation(double numA, double numB)
{
this->numA = numA;
this->numB = numB;
}
virtual double getResult() //虚函数
{
double result = 0;
return result;
}
protected:
double numA = 0;
double numB = 0;
};
class OperationAdd : public Operation
{
public:
OperationAdd(double numA, double numB)
{
this->numA = numA;
this->numB = numB;
}
double getResult() override
{
double result = 0;
result = numA + numB;
return result;
}
};
class OperationSub : public Operation
{
public:
OperationSub(double numA, double numB)
{
this->numA = numA;
this->numB = numB;
}
double getResult() override
{
double result = 0;
result = numA - numB;
return result;
}
};
class OperationMul : public Operation
{
public:
OperationMul(double numA, double numB)
{
this->numA = numA;
this->numB = numB;
}
double getResult() override
{
double result = 0;
result = numA * numB;
return result;
}
};
class OperationDiv : public Operation
{
public:
OperationDiv(double numA, double numB)
{
this->numA = numA;
this->numB = numB;
}
double getResult() override
{
double result = 0;
if (numB == 0)
throw exception("分母不为零");
result = numA /numB;
return result;
}
};
class OperationFactory
{
public:
static Operation *createOperate(char operate, double numA, double numB)
{
Operation *oper = nullptr;
switch (operate)
{
case '+':
oper = new OperationAdd(numA,numB);
break;
case '-':
oper = new OperationSub(numA,numB);
break;
case '*':
oper = new OperationMul(numA,numB);
break;
case '/':
oper = new OperationDiv(numA,numB);
break;
}
return oper;
}
};
int main()
{
try{
OperationFactory operFact;
Operation *oper = nullptr;
double numA, numB;
cout << "请输入数字A:" << endl;
cin >> numA;
char sign;
cout << "请选择运算符号(+、-、*、/):" << endl;
cin >> sign;
cout << "请输入数字B: " << endl;
cin >> numB;
oper = operFact.createOperate(sign,numA,numB);
double result = oper->getResult();
cout << "结果是:" << result << endl;
delete Oper;
}
catch (exception &e)
{
cout << "您的输入有误:" << e.what() << endl;
}
return 0;
}
简单工厂类[createOperate()]->运算类[加法类,减法类,乘法类,除法类]