通过实现计算器加减乘除功能来了解简单工厂模式。
github地址:https://github.com/lining91/DesignPattern
普通实现遇到的问题:
需要创建一群具体类来实现,会造成耦合的问题。
对于代码中变化的部分和不变的部分不区分开,造成维护的成本增加。
当需要删除已有的计算类型时,需要对现有的代码做修改,对于不变的部分也会有影响。
简单工厂模式实现:
为了提高内聚和松耦合将一些类的公共的接口以形成抽象基类或接口。通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。
通过定义创建对象的接口CreateOperation(),封装对象的创建,不同的计算类型创建不同的对象。增加(删除)计算类型只需要修改CreateOperation()和增加(删除)子类。
对于具体化类的GetResult()实现,放在子类中实现。
代码如下:
main.cpp文件
#include <iostream>
#include <stdio.h>
using namespace std;
#include "FactoryPattern.h"
void main()
{
char cOpe = '*';
int n1 = 33;
int n2 = 52;
FactoryPattern cfactory;
Operation* pOpe = cfactory.CreateOperation(cOpe);
if (pOpe == NULL)
{
cout << "输入的计算符号不正确" << endl;
return;
}
try{
int nResult = pOpe->GetResult(n1, n2);
cout << n1 << cOpe << n2 << " is " << nResult << endl;
}
catch(char* pErr)
{
cout << pErr << endl;
}
delete pOpe;
pOpe == NULL;
system("pause");
}
FactoryPattern.h文件
#include <stdio.h>
// 实现计算器的功能
// 操作基类
class Operation{
public:
virtual int GetResult(int n1, int n2) = 0;
public:
int n1;
int n2;
};
// 加减乘数类
class OperationAdd : public Operation{
public:
virtual int GetResult(int n1, int n2)
{
return n1 + n2;
}
};
class OperationSub : public Operation{
public:
virtual int GetResult(int n1, int n2)
{
return n1 - n2;
}
};
class OperationMul : public Operation{
public:
virtual int GetResult(int n1, int n2)
{
return n1 * n2;
}
};
class OperationDiv : public Operation{
public:
virtual int GetResult(int n1, int n2)
{
if (n2 == 0)
throw "除数不能为0!";
return n1 / n2;
}
};
//简单工厂类
class FactoryPattern{
public:
Operation* CreateOperation(char cOpe);
};
FactoryPattern.cpp文件
#include "FactoryPattern.h"
Operation* FactoryPattern::CreateOperation(char cOpe)
{
switch(cOpe)
{
case ('+'):
return new OperationAdd();
break;
case ('-'):
return new OperationSub();
break;
case ('*'):
return new OperationMul();
break;
case ('/'):
return new OperationDiv();
break;
default:
return NULL;
}
}
运行结果如下: