title | date | tags | categories | description | |||
---|---|---|---|---|---|---|---|
简单工厂模式
|
2020-03-06 05:04:12 -0800
|
|
|
|
面向对象的三大特性:封装,继承和多态
介绍
- 一般来说,工厂模式需要三个类
- 抽象产品类:简单工厂模式中所有对象的父类,负责描述接口
- 具体产品类:继承自抽象产品类,是简单工厂模式的创建目标
- 工厂类:简单工厂模式的核心,负责判断到底需要实例化谁
实现
假设需要设计一个执行两个数字简单四则运算的程序
抽象产品类
抽象出该程序中公共的内容:两个数字,及其get
,set
方法
//运算基类
class Operation {
public:
double num1;
double num2;
double GetNum1();
void SetNum1(double num);
double GetNum2();
void SetNum2(double num);
virtual double GetResult() = 0;
//定义虚析构函数
virtual ~Operation() { printf("del opera\n"); }
};
//方法的实现
double Operation::GetNum1() { return num1; }
void Operation::SetNum1(double num) { num1 = num; }
double Operation::GetNum2() { return num2; }
void Operation::SetNum2(double num) { num2 = num; }
具体产品类
接下来写出每个运算的具体类
//加法
class Add : public Operation {
public:
double GetResult();
~Add() { printf("deladd\n"); };
};
//减法
class Sub : public Operation {
public:
double GetResult();
~Sub() { printf("delsub\n"); };
};
//乘法
class Mul : public Operation {
public:
double GetResult();
~Mul() { printf("delmul\n"); };
};
//除法
class Div : public Operation {
public:
double GetResult();
~Div() { printf("deldiv\n"); };
};
double Add::GetResult() { return num1 + num2; }
double Sub::GetResult() { return num1 - num2; }
double Mul::GetResult() { return num1 * num2; }
double Div::GetResult() {
if (num2 == 0)
throw "除数不能为0";
return num1 / num2;
}
工厂类
这个类用于判断什么时候实例出哪一个类的对象
//运算简单工厂类
class OperationFactory {
public:
//提供静态方法
static Operation* CreateOperation(const char* opearte);
};
Operation* OperationFactory::CreateOperation(const char* opearte) {
Operation* oper = NULL;
if (strcmp(opearte, "+") == 0)
oper = new Add;
else if (strcmp(opearte, "-") == 0)
oper = new Sub;
else if (strcmp(opearte, "*") == 0)
oper = new Mul;
else if (strcmp(opearte, "/") == 0)
oper = new Div;
return oper;
}
主函数
int main() {
//由工厂类来判断到底需要创建什么对象
Operation* oper = OperationFactory::CreateOperation("+");
oper->SetNum1(10);
oper->SetNum2(20);
printf("res=%lf", oper->GetResult());
//析构
delete oper;
return 0;
}
输出
res=30.000000
deladd
del opera
总结
使用简单工厂模式后,更为方便扩展,当需要添加新的运算如次方根等时,需要
- 添加相应的运算子类
- 在工厂类中添加新的判断分支 而不需要影响整个代码