簡單工廠模式符合面向對象4大原則:可維護,可複用,可擴展,靈活性高,耦合度低,但是他仍然有一個很
大的問題就是如果要增加新的產品,必須對工廠進行修改,這就違背了軟件設計的開閉原則 。
對於這種問題,我們可以使用工廠模式來解決。
假設我們想要增加一個新的運算乘方運算類,我們可以按如下思想來設計:
設計基於運算基類的乘方類,這和簡單工廠模式相同,但在設計工廠的時候,我們把他的加工產品的方式分類,並且設計一個總廠(工廠基
類),這樣,我們需要產品的時候,只需要向總廠請求,總廠讓分廠來生產產品,如果有新的產品需要加工,只需設計一個新的工廠來加工
新產品就可以了,不需要對原廠進行更改。
實現代碼:
這裏繼續引用簡單工廠模式中的計算器類,對於原有的產品(運算類和運算基類)我們不做更改,我們只設計新的工廠;
//乘方類
#ifndef OPERATIONPOWER
#define OPERATIONPOWER
class OperationPower:public Operation
{
public:double GetResult(double numA, double numB);
};
#endif
//基類工廠
#ifndef FACTORY
#define FACTORY
class Factory
{
public:virtual Operation * CreateOperation(char operate);
};
#endif
//原有的基礎運算基類
#ifndef FACTORY1
#define FACTORY1
class Factory1:public Factory
{
public:Operation *CreateOperation(char operate);
};
#endif
//運算基類實現
Operation *Factory1::CreateOperation(char operate)
{
std::cout<<"It is the Factory1!"<< p ><>
Operation *oper = NULL;
switch(operate)
{
case '+':oper = new OperationAdd();
break;
case '-':oper = new OperationSub();
break;
case '*':oper = new OperationMul();
break;
case '/':oper = new OperationDiv();
break;
default: std::cout<<"The Operation is Error!"<
oper = new Operation();
break;
}
return oper;
}
//新增加乘方運算處理工廠
#ifndef FACTORYNEW1
#define FACTORYNEW1
class FactoryNew1:public Factory
{
public:Operation *CreateOperation(char operate);
};
#endif
//處理工廠實現
Operation *FactoryNew1::CreateOperation(char operate)
{
std::cout<<"It is a New Factory!\n";
Operation *oper = NULL;
switch(operate)
{
case '^':oper = new OperationPower();
break;
case 'e':exit(0);
break;
default:
std::cout<<"The Operation is Error!"<
oper = new Operation();
break;
}
return oper;
}
//客戶端實現
int main(void)
{
Factory *p = new Factory1();
Operation *oper = p->CreateOperation('+');
double result = 0;
double numA = 20;
double numB = 4;
result = oper->GetResult(numA, numB);
std::cout<<"numA + numB 's result is:"<< n p="" >< n>
delete p;
delete oper;
p = new FactoryNew1();
oper = p->CreateOperation('^');
result = oper->GetResult(numA, numB);
std::cout<<"numA ^ numB 's result is:"<< n p="" >< n>
system("pause");
return 0;
}
說明:
/*
*優點:彌補了簡單工程模式的不足,擴充新的產品不在需要改動工廠,可直接設計子工廠就可完成
*缺點:對創造不同系列的新產品無能爲力
*/