簡單工廠和工廠模式
工廠模式】:定義一個用於建立物件的介面, 讓子類決定例項化哪一個類。Factory Method使一個類的例項化延遲到其子類。適用性當一個類不知道它所必須建立的物件的類的時候。當一個類希望由它的子類來指定它所建立的物件的時候。當類將建立物件的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一資訊區域性化的時候。
以簡單計算器為例:
【簡單工廠實現】:
using System;
//【簡單工廠類】
classOperationFactory
{
publicstatic Operation CreateOperation(string operate)
{
Operation oper=null;//儲存Operation類的一個引用。
//讓子類決定例項化哪一個類
switch(operate)
{
case"+":
oper=new OperationAdd();
break;
case"-":
oper=new OperationSub();
break;
case"*":
oper=new OperationMul();break;
case"/":
oper=new OperationDiv();break;
}
return oper;
}
}
//【運算類】
abstractclassOperation
{
publicint NumberA;
publicint NumberB;
publicabstract
}
classOperationAdd:Operation
{
publicoverridevoid GetResult()
{
Console.WriteLine("計算加法時結果為:"+(NumberA+NumberB));
}
}
classOperationSub:Operation
{
publicoverridevoid GetResult()
{
Console.WriteLine("計算減法時結果為:"+(NumberA-NumberB));
}
}
classOperationMul:Operation
{
public
{
Console.WriteLine("計算乘法時結果為:"+(NumberA*NumberB));
}
}
classOperationDiv:Operation
{
publicoverridevoid GetResult()
{
Console.WriteLine("計算除法時結果為:"+(NumberA/NumberB));
}
}
//【客戶端程式碼】
classApp
{
staticvoid Main()
{
Operation oper;
oper=OperationFactory.CreateOperation("+");
oper.NumberA=1;
oper.NumberB=2;
oper.GetResult();
}
}
工廠模式實現
【工廠模式】:
using System;
//【運算類】
abstractclassOperation//運算基類;
{
publicint NumberA;
publicint NumberB;
publicabstractvoid GetResult();
}
classOperationAdd:Operation //加法;
{
publicoverridevoid GetResult()
{
Console.WriteLine("計算加法時結果為:"+(NumberA+NumberB));
}
}
classOperationSub:Operation //減法;
{
publicoverridevoid GetResult()
{
Console.WriteLine("計算減法時結果為:"+(NumberA-NumberB));
}
}
classOperationMul:Operation //乘法;
{
publicoverridevoid GetResult()
{
Console.WriteLine("計算乘法時結果為:"+(NumberA*NumberB));
}
}
classOperationDiv:Operation //除法;
{
publicoverridevoid GetResult()
{
Console.WriteLine("計算除法時結果為:"+(NumberA/NumberB));
}
}
//【Factory介面】
interfaceIFactory
{
Operation CreateOperaion();
}
//【工廠類】
classAddFactory:IFactory//加法工廠類
{
public Operation CreateOperaion()
{
returnnew OperationAdd();
}
}
classSubFactory:IFactory//減法工廠類
{
public Operation CreateOperaion()
{
returnnew OperationSub();
}
}
classMulFactory:IFactory//乘法工廠類
{
public Operation CreateOperaion()
{
returnnew OperationMul();
}
}
classDivFactory:IFactory//除法工廠類
{
public Operation CreateOperaion()
{
returnnew OperationDiv();
}
}
//【客戶端程式碼】
classApp
{
staticvoid Main()
{
//真正體現對介面程式設計
IFactory operFactory=new AddFactory();//例項化一個加法工廠;
Operation oper=operFactory.CreateOperaion();
oper.NumberA=1;
oper.NumberB=2;
oper.GetResult();
}
}
簡單工廠模式的最大優點在於:工廠類中包含了必要的判斷邏輯,根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴。
工廠方法模式實現時,客戶端需要決定例項化哪一個工廠來實現運算類,選擇判斷的問題還是存在,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端程式碼來進行。你想要加功能,本來是改工廠類的,現在只改客戶端了。
工廠方法模式克服了簡單工廠模式違背開放-封閉原則,又保持了封裝物件建立過程的優點。工廠方法模式是簡單工廠模式的進一步抽象和推廣。