引入:
类的创建型模式,一个工厂对象决定应该创建哪一种产品类的实例,这样外界就不用直接创建对象而只要消费对象就可以了,也不必知道这些对象是如何创建如何组织的,这样就明确了各自的职责和权利。有利于软件体系结构的优化和重构。
角色以及指责:
-
工厂Factory:模式的核心,负责创建各所有实例的内部逻辑,可以被外界调用,创建所需要的产品对象。
-
抽象产品角色AbstractProduct:工厂所创建的产品对象的父类,提供统一的公共访问接口。
-
具体产品角色ConcreteProduct:创建的目标,每个对象都是充当这个角色的具体实例
缺点:
由于工厂类集中了所有实例的创建,违反了高内聚的责任分配原则,如果要添加新的类就需要改变工厂。
当具体产品类增多的适合,工厂可能会根据各种不同的要求来创建实例,可能出现各种条件判断创建交织一起,很难避免模块功能的蔓延,不利于系统的维护和扩展。但是在工厂方法模式中得到一定的克服。
使用场景:
-
Factoty负责创建的实例比较少
-
客户只知道传入工厂的参数,对如何创建的逻辑不关心
-
一般很少情况下使用,因为违反高内聚的原则
Example:计算器
// 简单工厂模式 实例:计算器
#include <iostream>
#include <cstdlib>
using namespace std;
//抽象产品类 -- 运算
class Operation
{
public:
virtual double getResult()
{
double result = 0;
return result;
}
double getNumA() const {
return numA;
}
void setNumA(double numA) {
this->numA = numA;
}
double getNumB() const {
return numB;
}
void setNumB(double numB) {
this->numB = numB;
}
private:
double numA;
double numB;
};
//产品类 加法
class OperationAdd : public Operation
{
public:
double getResult()
{
double result = 0;
result = getNumA() + getNumB();
return result;
}
};
//产品类 减法
class OperationSub : public Operation
{
public:
double getResult()
{
double result = 0;
result = getNumA() - getNumB();
return result;
}
};
//产品类 乘法
class OperationMul : public Operation
{
public:
double getResult()
{
double result = 0;
result = getNumA() * getNumB();
return result;
}
};
//产品类 除法
class OperationDiv : public Operation
{
public:
double getResult()
{
double result = 0;
if(getNumB() == 0)
{
std::cout << "除数不能为0" << std::endl;
exit(1);
}
result = getNumA() / getNumB();
return result;
}
};
//新增了运算Pow,A的B次方,只需要增加class OperationPow以及修改Factory即可
class OperationPow : public Operation
{
public:
double getResult()
{
double result = 1;
for(int i= 0; i<getNumB(); i++)
{
result = result * getNumA();
}
return result;
}
};
//工厂类,负责创建产品
class OperationFactory
{
public:
static Operation* createOperation(char opr)
{
Operation *pOpr;
switch(opr)
{
case '+':
pOpr = new OperationAdd();
break;
case '-':
pOpr = new OperationSub();
break;
case '*':
pOpr = new OperationMul();
break;
case '/':
pOpr = new OperationDiv();
break;
case 'p':
pOpr = new OperationPow();
break;
}
return pOpr;
}
};
int main() {
Operation *p;
p = OperationFactory::createOperation('p');
p->setNumA(5);
p->setNumB(3);
double re = p->getResult(); //125
std::cout << re << std::endl;
return 0;
}
小小的计算器完啦!怎样,简单吧。。。