大话设计模式1-简单工厂
1.需求:设计一个计算器
需要支持加减乘除四种运算
2.普通实现
设计一个Operation
类,根据输入的数字和运算符确定执行什么操作
class Operation {
public:
double GetResult(double numA, double numB, char oper)
{
double res = 0.0;
switch (oper)
{
case '+':
res = numA + numB;
break;
case '-':
res = numA - numB;
break;
case '*':
res = numA * numB;
break;
case '/':
res = numA / numB;
break;
}
return res;
}
};
#include<iostream>
#include"Operation.h"
using namespace std;
int main()
{
int numA, numB; char oper;
Operation op;
cout << "请输入数字A" << endl;
cin >> numA;
cout << "请选择符号+ - * /" << endl;
cin >> oper;
cout << "请输入数字B" << endl;
cin >> numB;
cout << op.GetResult(numA, numB, oper) << endl;
return 0;
}
2.存在问题
普通实现只是实现了业务的封装,如果新增一种运算需要修改switch
语句,破坏了开闭原则。不仅如此,我们需要面向对象的设计方法,实现加减运算的分离,从紧耦合变为松耦合。
3.简单工厂
设计一个运算类Operation1
,有两个成员函数numA,numB。支持获取和改变两个数的操作,再设计一个虚方法计算结果,虚方法由子类实现。
//Operation1.h
#pragma once
class Operation1 {
public:
double getnumA() { return numA; }
double getnumB() { return numB; }
void setnumB(double num)
{
numB = num;
}
void setnumA(double num)
{
numA = num;
}
virtual double getRes()
{
double res = 0;
return res;
};
private:
double numA, numB;
};
再设计加减乘除四个类继承运算类
#pragma once
#include "Operation1.h"
class operAdd : public Operation1{
double getRes()
{
double res = 0;
res = getnumA() + getnumB();
return res;
}
};
#pragma once
#include "Operation1.h"
class operSub : public Operation1 {
double getRes()
{
double res = 0;
res = getnumA() - getnumB();
return res;
}
};
#pragma once
#include "Operation1.h"
class operMul : public Operation1 {
double getRes()
{
double res = 0;
res = getnumA() * getnumB();
return res;
}
};
#pragma once
#include "Operation1.h"
class operDiv : public Operation1 {
double getRes()
{
double res = 0;
res = getnumA() / getnumB();
return res;
}
};
我们还可以设计个工厂类,输入运算的符号,工厂就可以实例出合适的对象,通过多态实现加减乘除操作
用一个单独的类做创造实例的过程即工厂
#pragma once
#include "Operation1.h"
#include "operAdd.h"
#include "operMul.h"
#include "operSub.h"
#include "operDiv.h"
class operationFactory {
public:
Operation1* createOper(char oper)
{
Operation1* op = nullptr;
switch (oper)
{
case '+':
op = new operAdd();
break;
case '-':
op = new operSub();
break;
case '*':
op = new operMul();
break;
case '/':
op = new operDiv();
break;
}
return op;
}
};
类图如下:
我们主函数可以如下写:
#include<iostream>
#include"Operation1.h"
#include"operationFactory.h"
using namespace std;
int main()
{
Operation1* op;
operationFactory factory;
int numA, numB; char oper;
cout << "请输入数字A:" << endl;
cin >> numA;
cout << "请选择符号+ - * /:" << endl;
cin >> oper;
cout << "请输入数字B:" << endl;
cin >> numB;
op = factory.createOper(oper);
op->setnumA(numA);
op->setnumB(numB);
double res = op->getRes();
cout << "运算结果:" << endl;
cout << res<<endl;
delete op;
op = nullptr;
system("pause");
return 0;
}