引入:
類的創建型模式,一個工廠對象決定應該創建哪一種產品類的實例,這樣外界就不用直接創建對象而只要消費對象就可以了,也不必知道這些對象是如何創建如何組織的,這樣就明確了各自的職責和權利。有利於軟件體系結構的優化和重構。
角色以及指責:
-
工廠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;
}
小小的計算器完啦!怎樣,簡單吧。。。