本期主题:
用C++实现简单工厂模式例子,并讲解
1.工厂模式是什么
工厂模式是一种创建型的设计模式,客户端不需要指定具体的类而能够直接创建对象。
将创建子类对象的过程推迟到工厂利用得到的信息来创建。
2.例子
实现一个计算器的例子
1 用面向过程的思想来设计
面向过程考虑这个程序非常简单:
- 输入运算符和需要计算的数字
- 根据输入的运算符来选择对应的公式
- 输出结果
int main(void)
{
char op;
float num1, num2;
cout << "请输入运算符 +、-、*、/ :";
cin >> op;
cout << "请输入两个运算数:";
cin >> num1 >> num2;
switch(op)
{
case '+':
cout << num1+num2;
break;
case '-':
cout << num1-num2;
break;
case '*':
cout << num1 * num2;
break;
case '/':
if (num2 == 0)
{
cout << "error不能除以零";
break;
}
else
{
cout << num1 / num2;
break;
}
default:
// 如果运算符不是 +, -, * 或 /, 提示错误信息
cout << "Error! 请输入正确运算符。";
break;
}
cout << "\n";
return 0;
}
这种方式的问题:
- 不利于后期维护,后期如果再需要加个其他运算符,那么需要把这整个逻辑都暴露给开发者,存在风险;
2 面向对象思想来设计
- 运算类作为一个接口,(c++的接口都是用虚函数来实现),其中有虚函数get_result()来返回结果;这个是工厂模式中的产品抽象;
- 继承自运算类,有几个具体的产品,就是加法运算类、减法运算类等等…
- 工厂类就是创建具体运算类的,通过输入的信息来创建子类,工厂类依赖于运算类,也可以说工厂类需要使用运算类
2.1.UML图
2.2.代码
//产品 product
class Operate
{
public:
float num1;
float num2;
virtual int get_result() = 0;
};
//具体产品
class add_operate : public Operate
{
public:
int get_result()
{
cout << (this->num1 + this->num2) << endl;
return 0;
}
};
//工厂类
class Create_oper
{
public:
Operate* create_product(char op) //不能直接返回抽象类,需要返回抽象类的指针
{
Operate* oper = NULL;
switch(op)
{
case '+':
cout << "Here is add operation";
oper = new add_operate(); //调用构造函数
break;
default:
// 如果运算符不是 +, -, * 或 /, 提示错误信息
cout << "Error! 请输入正确运算符。";
break;
}
if (oper != NULL)
{
return oper;
}
else
{
cout << "工厂类实例化对象失败";
return NULL;
}
}
};
int main()
{
char op;
float num1, num2;
float result;
cout << "请输入运算符 +、-、*、/ :";
cin >> op;
Operate *clac_oper = NULL;
Create_oper clac_create;
clac_oper = clac_create.create_product(op);
cout << "请输入两个运算数:";
cin >> clac_oper->num1 >> clac_oper->num2;
clac_oper->get_result();
delete clac_oper;
return 0;
}
3 推广工厂模式
参考链接: 工厂方法模式