尤为印象深刻的是,去年校招的时候有个几百人的公司技术负责人跟我说,不要以为学了几个设计模式就可以说是学到了,真正项目需要的都是十万行以上的,几个模式套着用,为的就是降低耦合度,和最大程度提高复用性,尽量分离客户端界面和逻辑。
今天刚好重新学习了简单工厂模式和策略,并且把两个模式相结合手敲了一边,看C#来写C++真有点不习惯!
我个人的理解,所谓工厂模式:就是需要什么,就new什么类出来,每个类的工作尽量单一。比如简单的面试题:用面向对象语言,手写实现加减乘除。
我需要4个类,加法类,减法类,乘法类,除法类,和一个抽象的运算类,最好用纯虚函数或者虚函数来实现多态!
我只要求,在客户端,输入两个数字,然后输入客户需要的运算方法,(尤其是注意除数不能为0!(lll¬ω¬))
class Operation//运算类所有的运算都将是我的儿子
{
public:
virtual double GetResult(double a, double b)//父类虚函数,用于获取计算结果
{
double result = 0;
return result;
}
};
class Add : public Operation//加法类继承父类,重写虚函数
{
public:
//功能实现
virtual double GetResult(double a, double b)
{
return a + b;
}
};
class Sub : public Operation//减法类
{
public:
virtual double GetResult(double a, double b)
{
//重写虚函数实现多态
return a - b;
}
};
class Mul : public Operation
{
public:
virtual double GetResult(double a, double b)
{
//乘法类的多态实现
return a * b;
}
};
class Div : public Operation
{
public:
virtual double GetResult(double a, double b)
{
//判断一下,如果除数为0,加1再除
if (b == 0)
{
return a / (b + 1);
}
else
return a / b;
}
};
好的,上面已经把逻辑业务方面给确定出来了,下面就是建立一个简单的工厂了,把需要运算的类给生产出来。
class OperationFactory//工厂类
{
public:
Operation* func(char ch)//构造函数返回运算类指针
{
//先初始化一下,不然vs2017无法通过编译
Operation* poer = NULL;
switch (ch)//根据传入函数实参的‘运算符’
{
case '+':
//只有父类指针指向子类对象,才能实现多态调用子类的虚函数
poer = new Add();
//需要做什么运算,就生成什么运算的类
break;
case '-':
poer = new Sub();
break;
case '*':
poer = new Mul();
break;
case '/':
poer = new Div();
break;
}
return poer;//最后,把poer指向的子类对象返回出去
}
};
下面是客户端代码。
int main()
{
OperationFactory *o = NULL;
Operation *p = NULL;
char ch;
cout << "先输入运算符,再输入你要运算的两个数" << endl;
cin >> ch;
double x, y;
cin >> x >> y;
p =( o->func(ch));
double a = p->GetResult(x, y);
cout << a << endl;
}