下面链接文章是我改写的简单工厂模式,可以和工厂模式做对比。
https://blog.csdn.net/qq_34784043/article/details/82925158
程序:输入两个数和运算符,得到 结果。
虽然工厂模式比简单工厂模式编写复杂一点,但是它更符合“开放-封闭原则”,就是程序增加功能应该是通过增加代码方式,而不是修改原来的代码。在简单工厂模式里每次增加一个功能,比如“取平方”,就要增加一个取平方的运算类和修改对应的工厂类。在工厂模式里面,只需要增加一个运算类和一个工厂类,其他程序不需要修改。
下面是UML图:
下面是 Operaction.h:
#pragma once
//运算类
class Operation {
private:
double _numberA;
double _numberB;
public:
void SetNumberA(double NumberA) {
_numberA = NumberA;
}
double GetNumberA() {
return _numberA;
}
void SetNumberB(double NumberB) {
_numberB = NumberB;
}
double GetNumberB() {
return _numberB;
}
virtual double GetResult() {
double result = 0;
return result;
}
};
//加法类
class OperationAdd :public Operation {
public:
virtual double GetResult() {
double result = 0;
result = GetNumberA() + GetNumberB();
return result;
}
};
//减法类
class OperationSub :public Operation {
public:
virtual double GetResult() {
double result = 0;
result = GetNumberA() - GetNumberB();
return result;
}
};
//乘法类
class OperationMul :public Operation {
public:
virtual double GetResult() {
double result = 0;
result = GetNumberA() * GetNumberB();
return result;
}
};
//除法类
class OperationDiv :public Operation {
public:
virtual double GetResult() {
double result = 0;
if (GetNumberB() == 0) {
char str[] = "除数不能为0";
throw str;
}
result = GetNumberA() / GetNumberB();
return result;
}
};
下面是Factory.h:
#pragma once
#include "Operation.h"
class IFactory {
public:
IFactory(){}
virtual double CreateOperation(double NumberA, double NumberB) = 0;
};
class AddFactory :public IFactory {
public:
virtual double CreateOperation(double NumberA, double NumberB) {
OperationAdd oper;
oper.SetNumberA(NumberA);
oper.SetNumberB(NumberB);
return oper.GetResult();
}
};
class SubFactory :public IFactory {
public:
virtual double CreateOperation(double NumberA, double NumberB) {
OperationSub oper;
oper.SetNumberA(NumberA);
oper.SetNumberB(NumberB);
return oper.GetResult();
}
};
class MulFactory :public IFactory {
public:
virtual double CreateOperation(double NumberA, double NumberB){
OperationMul oper;
oper.SetNumberA(NumberA);
oper.SetNumberB(NumberB);
return oper.GetResult();
}
};
class DivFactory :public IFactory {
public:
virtual double CreateOperation(double NumberA, double NumberB) {
OperationDiv oper;
oper.SetNumberA(NumberA);
oper.SetNumberB(NumberB);
return oper.GetResult();
}
};
下面是main.cpp:
#include "Factory.h"
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
try {
IFactory *operFactory = new AddFactory();
cout << "1 + 2 = " << operFactory->CreateOperation(1, 2) << endl;
}
catch (char str[]) {
cout << str << endl;
}
system("pause");
return 0;
}
运行结果: