设计模式(2)–简单工厂模式

Posted by Tango on September 10, 2015

工厂模式与单例模式一样都是属于创建型模式,替代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就可以得到结果,这就是简单工厂模式。