#工廠方法模式(Factory Method pattern)
##簡介
“工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式,它屬于類創建型模式。在工廠方法模式中,工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類。
##與簡單工廠模式的對比
以計算器為例
###簡單工廠模式
public class OperationFactory
{
public static operation createOperate(string operate)
{
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;
}
return oper;
}
}
客戶端代碼
Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
####工廠方法模式
```
interface IFactory
{
Operation CreateOperation();
}
```
然后加減乘除各建一個具體工廠去實現這個接口。
```
class addFactory: IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
class subFactory: IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
class mulFactory: IFactory
{
public Operation CreateOperation()
{
return new OperationMul();
}
}
class divFactory: IFactory
{
public Operation CreateOperation()
{
return new OperationDiv();
}
}
```
客戶端的實現是這樣的。
```
IFactory operFactory = new addFactory();
operation oper = operationFactory.CreateOperation();
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
```
***簡單工廠模式的最大優點在于工廠類中包涵了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對于客戶端來說,去除了與具體相關產品的依賴。***就像你的計算器,讓客戶端不用管該用哪個類的實例,只需要把'+'給工廠,工廠自動就給出了相應的實例,客戶端只要去做運算就可以了,不同的實例會實現不同的運算。但是問題也就在這里,如你所說,如果要加一個'求M數的N次方'的功能,我們是一定需要給運算工廠類的方法里加'case'的分支條件的,修改原來的類并不是好方法,這就等于說,我們不但對擴展開放了,對修改也開放了,這樣違背了開放封閉原則。
工廠方法模式,定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
其實你仔細觀察會發現,工廠方法模式實現時,客戶端需要決定實例化哪一個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端代碼來運行,你想要加功能,本來是修改工廠類的,而現在修改客戶端。