基本简介
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种
GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
实现方式(附图)
简单工厂模式的UML类图(见右图)
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
该模式中包含的角色及其职责
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
#include<iostream>
#include<String>
using namespace std;
//---------------运算类------------------
class Operation
{
public:
Operation()
{
_numberA=0;
_numberB=0;
}
Operation(double numberA,double numberB)
{
_numberA=numberA;
_numberB=numberB;
}
//
void setNumberA(double value)
{
_numberA=value;
}
double getNumberA()
{
return _numberA;
}
/
void setNumberB(double value)
{
_numberB=value;
}
double getNumberB()
{
return _numberB;
}
//
virtual double GetResult()
{
double result = 0;
return result;
}
private:
double _numberA;
double _numberB;
};
//--------------加减乘除类------------------
class OperationAdd:public Operation
{
public:
OperationAdd(){}
OperationAdd(double numberA,double numberB):Operation(numberA,numberB){}
double GetResult()
{
double result=0;
result=getNumberA()+getNumberB();
return result;
}
};
class OperationSub:public Operation
{
public:
OperationSub(){}
OperationSub(double numberA,double numberB):Operation(numberA,numberB){}
double GetResult()
{
double result=0;
result=getNumberA()-getNumberB();
return result;
}
};
class OperationMul:public Operation
{
public:
OperationMul(){}
OperationMul(double numberA,double numberB):Operation(numberA,numberB){}
double GetResult()
{
double result=0;
result=getNumberA()*getNumberB();
return result;
}
};
class OperationDiv:public Operation
{
public:
OperationDiv(){}
OperationDiv(double numberA,double numberB):Operation(numberA,numberB){}
double GetResult()
{
double result=0;
if(getNumberB()==0)
{
throw new exception("除数不能为0");
}
result=getNumberA()/getNumberB();
return result;
}
};
//------------简单运算工厂类----------------
class OperationFactory
{
public:
Operation *createOperation(char operate)
{
switch(operate)
{
case '+':
oper = new OperationAdd();
break;
case '-':
oper = new OperationSub();
break;
case '*':
oper = new OperationMul();
break;
case '/':
oper = new OperationDiv();
break;
}
return oper;
}
private:
Operation *oper;
};
int main()
{
Operation *oper;
OperationFactory OperFactory;
oper = OperFactory.createOperation('+');
oper->setNumberA(3);
oper->setNumberB(2);
double result = oper->GetResult();
cout<<"result = "<<result<<endl;
return 0;
}