工厂模式与单例模式一样都是属于创建型模式,替代new关键字用于创建对象。客户端只需要告知工厂需要生产的产品类型,工厂就会返回相应的生产工具,并且客户端使用工具的方法是一致的(一致的接口),可以不用管具体的实现手段。
模式适用性
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望通过统一接口操作的时候。
模式结构
实现
例如:客户需要计算两个数字操作的结果,要求工厂(Factory)提供一个工具叫做”Operation”,通过“Operation”的“GetResult”操作便可以获得结果,那么具体可能用到的“+ – * /”操作需要等到以后才能告诉工厂,也有可能增加幂运算等其他操作。
#include <iostream>
class Operation
{
public:
double numberA;
double numberB;
Operation(){};
virtual ~Operation(){};
virtual double GetResult() = 0;
};
class OperationAdd : public Operation
{
public:
double GetResult()
{
return numberA + numberB;
}
};
class OperationSub : public Operation
{
public:
double GetResult()
{
return numberA - numberB;
}
};
class OperationMul : public Operation
{
public:
double GetResult()
{
return numberA * numberB;
}
};
class OperationDiv : public Operation
{
public:
double GetResult()
{
return numberA / numberB;
}
};
class Factory
{
public:
static Operation* createOperate(char op)
{
switch(op)
{
case '+':
return new OperationAdd();
case '-':
return new OperationSub();
case '*':
return new OperationMul();
case '/':
return new OperationDiv();
}
}
};
int main(int argc,char *argv[])
{
std::cout << "I'm customer\n";
std::cout << "I need toos for '+' \n";
Operation *op = Factory::createOperate('+');
std::cout << "and now i put '2' to numberA and '3' to numberB\n"; op->numberA = 2;
op->numberB = 3;
std::cout << "then i call 'GetResult'\n";
std::cout << op->GetResult() << std::endl;
delete op;
return 0;
}
在以后,客户可以向工厂提要求,要实现’^’符号幂操作,那么工厂按要求根据’^’符号返回幂操作的工具给客户,客户仍然是只要填充两个数字,和使用GetResult就可以得到结果,这就是简单工厂模式。