简单工厂模式(Simple Factory)
简单工厂模式包含三种角色:
1、工厂(Creator)角色:简单工厂模式的核心,负责实现所有实例的内部逻辑。工厂类可以被外部直接调用,创建所需的产品对象。
2、抽象产品(Product)角色:所有产品对象的父类,负责描述所有实例所共有的接口。
3、具体产品(Concrete Product)角色:所有创建的对象所对应的具体的类。
//SimpleFactory.h
#include <iostream>
#include <string>
using namespace std;
class Operation //所有运算类的父类
{
protected:
int numberA;
int numberB;
public:
void SetNumberA(int numberA)
{
this->numberA = numberA;
}
void SetNumberB(int numberB)
{
this->numberB = numberB;
}
virtual int GetResult()
{
return 0;
}
};
class Add: public Operation //加运算
{
public:
virtual int GetResult()
{
return numberA + numberB;
}
};
class Subtract: public Operation //减运算
{
public:
virtual int GetResult()
{
return numberA - numberB;
}
};
class Multiply: public Operation //乘运算
{
public:
virtual int GetResult()
{
return numberA * numberB;
}
};
class Divide: public Operation //除运算
{
public:
virtual int GetResult()
{
if (numberB == 0)
{
return 0;
}
return numberA / numberB;
}
};
class OperationFactory //生产运算类的工厂类
{
public:
static Operation* CreateOperation(char operate)
{
Operation *oper;
switch (operate)
{
case '+':
oper = new Add();
break;
case '-':
oper = new Subtract();
break;
case '*':
oper = new Multiply();
break;
case '/':
oper = new Divide();
break;
default:
oper = NULL;
}
return oper;
}
};
//SimpleFactory.cpp
#include "SimpleFactory.h"
using namespace std;
int main()
{
Operation *oper;
char operate;
int numberA, numberB;
cin>>numberA>>numberB;
getchar();
cin>>operate;
OperationFactory factory;
oper = factory.CreateOperation(operate);
oper->SetNumberA(numberA);
oper->SetNumberB(numberB);
int result = oper->GetResult();
cout<<result<<endl;
return 0;
}
优点:工厂类中包含了必要的逻辑判断,根据外界给定的信息决定创建具体的对象。通过工厂类,外界可以从直接创建具体产品对象的局面摆脱出来,仅需要负责消费对象就可以了,而不必考虑这些对象是如何创建和组织的,明确了各自的职责和权利。
缺点:工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新类,则需要改变工厂类。
适用场景:
1、工厂类负责创建的对象比较少。
2、客户只知道传入工厂类的参数,对于如何创建对象不关心。
浙公网安备 33010602011771号