上次的代码封装的还不是很好,如果增加开方算法时,其它的算法也能被看到,如果以前的代码被误改了呢,这样不好~
这次主要对上次的代码进行改进。
现在请出主角24种模式中的第一种模式-----------“简单工厂模式“
我们会想到把每种运算封装成一个单独的类,这样就可以降低耦合程度,修改一个不会看到另一个。但是问题来了,到底实例化哪个类? 将来会增加哪些类?这些都很容易发生变化,所以应该考虑一个单独的类来做这个创造实例的过程,从来以不变应万变,这就是所谓的工厂。
------------------------------------------------------------------------------------------------------------------
MD,我怒了,买了本设计模式是用c#写的,本来c++就不好,还要做这种转换,有不对的地方欢迎指正~~~
-----------------------------------------------------------------------------------------------------------------
#include<iostream>
using namespace std;
class Operator
{
public:
Operator(double num1,double num2):m_num1(num1),m_num2(num2){}
virtual double GetValue(void)
{
double value = 0;
return value;
}
double GetNum1(void)
{
return m_num1;
}
double GetNum2(void)
{
return m_num2;
}
private:
double m_num1,m_num2;
};
class OperatorAdd:public Operator
{
public:
OperatorAdd(double num1,double num2):Operator(num1,num2){}
double GetValue(void)
{
return GetNum1() + GetNum2();
}
};
class OperatorSub:public Operator
{
public:
OperatorSub(double num1,double num2):Operator(num1,num2){}
double GetValue(void)
{
return GetNum1() - GetNum2();
}
};
class OperatorMul:public Operator
{
public:
OperatorMul(double num1,double num2):Operator(num1,num2){}
double GetValue(void)
{
return GetNum1() * GetNum2();
}
};
class OperatorDiv:public Operator
{
public:
OperatorDiv(double num1,double num2):Operator(num1,num2){}
double GetValue(void)
{
return GetNum1() / GetNum2();
}
};
class OperationFactory
{
public:
Operator* CreateOperator(double num1,double num2, char op)
{
Operator *oper = NULL ;
switch(op)
{
case '+':
oper = new OperatorAdd(num1,num2);
break;
case '-':
oper = new OperatorSub(num1,num2);
break;
case '*':
oper = new OperatorMul(num1,num2);
break;
case '/':
oper = new OperatorDiv(num1,num2);
break;
}
return oper;
}
};
int main(void)
{
int num1,num2;
char op;
Operator *cal = NULL;
OperationFactory factory;
cout << "please input num1" << endl;
cin >> num1;
cout << "please input num2" << endl;
cin >> num2;
cout << "please input the operator" << endl;
cin >> op;
cout << num1 << " " << op << " " << num2 << " " << "=" << " ";
cal = factory.CreateOperator(num1,num2,op);
cout << cal->GetValue() << endl;
return 0;
}