简单工厂模式
C++版本
参考:https://www.cnblogs.com/Galesaur-wcy/p/15926669.html
#include <iostream>
using namespace std;
// 运算类
class Operation
{
private:
double _NumA;
double _NumB;
public:
void SetNumA()
{
cout << "Enter a double number: ";
if (!(cin >> _NumA))
throw "It must be a number";
}
double GetNumA()
{
return _NumA;
}
void SetNumB()
{
cout << "Enter a double number: ";
if (!(cin >> _NumB))
throw "It must be a number";
}
double GetNumB()
{
return _NumB;
}
virtual double GetResult()
{
int result = 0;
return result;
}
};
class OperationAdd : public Operation
{
public:
double GetResult()
{
double result = GetNumA() + GetNumB();
return result;
}
};
class OperationSub : public Operation
{
public:
double GetResult()
{
double result = GetNumA() - GetNumB();
return result;
}
};
class OperationMul : public Operation
{
public:
double GetResult()
{
double result = GetNumA() * GetNumB();
return result;
}
};
class OperationDiv : public Operation
{
public:
double GetResult()
{
if (GetNumB() == 0)
{
throw "The divisor cannot be 0";
}
double result = GetNumA() / GetNumB();
return result;
}
};
class OperatorFactory
{
public:
Operation *CreatOperation(char s)
{
Operation *ope = nullptr;
switch (s)
{
case '+':
ope = new OperationAdd;
break;
case '-':
ope = new OperationSub;
break;
case '*':
ope = new OperationMul;
break;
case '/':
ope = new OperationDiv;
break;
default:
throw "Error input operator!";
break;
}
return ope;
}
};
int main()
{
OperatorFactory fac;
cout << "Choose an operation:";
char operator_char;
cin >> operator_char;
try
{
Operation *oper = fac.CreatOperation(operator_char);
oper->SetNumA();
oper->SetNumB();
cout << "result is: " << oper->GetResult() << endl;
}
catch (const char *err)
{
cerr << err << endl;
return -1;
}
return 0;
}
C版本
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
typedef struct Operation
{
double NumA;
double NumB;
double (*GetResult)(struct Operation *);
} Operation;
typedef struct OperationAdd
{
Operation base; // 设置为第一个成员属性,模拟继承
} OperationAdd;
typedef struct OperationSub
{
Operation base;
} OperationSub;
typedef struct OperationMul
{
Operation base;
} OperationMul;
typedef struct OperationDiv
{
Operation base;
} OperationDiv;
double OperationAddGetResult(struct Operation *op)
{
OperationAdd *add = (OperationAdd *)op;
return add->base.NumA + add->base.NumB;
}
double OperationSubGetResult(struct Operation *op)
{
OperationSub *sub = (OperationSub *)op;
return sub->base.NumA - sub->base.NumB;
}
double OperationMulGetResult(struct Operation *op)
{
OperationMul *mul = (OperationMul *)op;
return mul->base.NumA * mul->base.NumB;
}
double OperationDivGetResult(struct Operation *op)
{
OperationDiv *div = (OperationDiv *)op;
if (div->base.NumB == 0)
{
fputs("The divisor cannot be 0\n", stderr);
exit(EXIT_FAILURE);
}
return div->base.NumA / div->base.NumB;
}
Operation *CreateOperation(char op)
{
Operation *ope = NULL;
switch (op)
{
case '+':
ope = malloc(sizeof(OperationAdd));
ope->GetResult = OperationAddGetResult;
break;
case '-':
ope = malloc(sizeof(OperationSub));
ope->GetResult = OperationSubGetResult;
break;
case '*':
ope = malloc(sizeof(OperationMul));
ope->GetResult = OperationMulGetResult;
break;
case '/':
ope = malloc(sizeof(OperationDiv));
ope->GetResult = OperationDivGetResult;
break;
default:
fputs("Error input operator!\n", stderr);
return NULL;
}
return ope;
}
void SetNumA(Operation *ope)
{
printf("Enter a double number: ");
if (scanf("%lf", &ope->NumA) != 1)
{
fputs("It must be a number\n", stderr);
exit(EXIT_FAILURE);
}
}
void SetNumB(Operation *ope)
{
printf("Enter a double number: ");
if (scanf("%lf", &ope->NumB) != 1)
{
fputs("It must be a number\n", stderr);
exit(EXIT_FAILURE);
}
}
int main()
{
printf("Choose an operation: ");
char operator_char = getchar();
Operation *oper = CreateOperation(operator_char);
if (!oper)
return EXIT_FAILURE;
SetNumA(oper);
SetNumB(oper);
printf("Result is: %f\n", oper->GetResult(oper));
free(oper);
return 0;
}
在前一版的基础上,将SetNumA和SetNumB设置为Operation类(结构体)的行为,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
typedef struct Operation
{
double NumA;
double NumB;
double (*GetResult)(struct Operation *);
void (*SetNumA)(struct Operation *);
void (*SetNumB)(struct Operation *);
} Operation;
typedef struct OperationAdd
{
Operation base; // 设置为第一个成员属性,模拟继承
} OperationAdd;
typedef struct OperationSub
{
Operation base;
} OperationSub;
typedef struct OperationMul
{
Operation base;
} OperationMul;
typedef struct OperationDiv
{
Operation base;
} OperationDiv;
double OperationAddGetResult(struct Operation *op)
{
OperationAdd *add = (OperationAdd *)op;
return add->base.NumA + add->base.NumB;
}
double OperationSubGetResult(struct Operation *op)
{
OperationSub *sub = (OperationSub *)op;
return sub->base.NumA - sub->base.NumB;
}
double OperationMulGetResult(struct Operation *op)
{
OperationMul *mul = (OperationMul *)op;
return mul->base.NumA * mul->base.NumB;
}
double OperationDivGetResult(struct Operation *op)
{
OperationDiv *div = (OperationDiv *)op;
if (div->base.NumB == 0)
{
fputs("The divisor cannot be 0\n", stderr);
exit(EXIT_FAILURE);
}
return div->base.NumA / div->base.NumB;
}
void SetNumA(Operation *ope)
{
printf("Enter a double number: ");
if (scanf("%lf", &ope->NumA) != 1)
{
fputs("It must be a number\n", stderr);
exit(EXIT_FAILURE);
}
}
void SetNumB(Operation *ope)
{
printf("Enter a double number: ");
if (scanf("%lf", &ope->NumB) != 1)
{
fputs("It must be a number\n", stderr);
exit(EXIT_FAILURE);
}
}
Operation *CreateOperation(char op)
{
Operation *ope = NULL;
switch (op)
{
case '+':
ope = malloc(sizeof(OperationAdd));
ope->GetResult = OperationAddGetResult;
break;
case '-':
ope = malloc(sizeof(OperationSub));
ope->GetResult = OperationSubGetResult;
break;
case '*':
ope = malloc(sizeof(OperationMul));
ope->GetResult = OperationMulGetResult;
break;
case '/':
ope = malloc(sizeof(OperationDiv));
ope->GetResult = OperationDivGetResult;
break;
default:
fputs("Error input operator!\n", stderr);
return NULL;
}
ope->SetNumA = SetNumA;
ope->SetNumB = SetNumB;
return ope;
}
int main()
{
printf("Choose an operation: ");
char operator_char = getchar();
Operation *oper = CreateOperation(operator_char);
if (!oper)
return EXIT_FAILURE;
oper->SetNumA(oper);
oper->SetNumB(oper);
printf("Result is: %f\n", oper->GetResult(oper));
free(oper);
return 0;
}