699
汽車大全
簡單工廠和工廠模式
工廠模式】:
定義一個用於創建對象的接口, 讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。
適用性
當一個類不知道它所必須創建的對象的類的時候。
當一個類希望由它的子類來指定它所創建的對象的時候。
當類將創建對象的職責委托給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
以簡單計算器為例:
【簡單工廠實現】:
using System;
//【簡單工廠類】
class OperationFactory
{
public static 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;
}
}
//【運算類】
abstract class Operation
{
public int NumberA;
public int NumberB;
public abstract void GetResult();
}
class OperationAdd:Operation
{
public override void GetResult()
{
Console.WriteLine("計算加法時結果為:"+(NumberA+NumberB));
}
}
class OperationSub:Operation
{
public override void GetResult()
{
Console.WriteLine("計算減法時結果為:"+(NumberA-NumberB));
}
}
class OperationMul:Operation
{
public override void GetResult()
{
Console.WriteLine("計算乘法時結果為:"+(NumberA*NumberB));
}
}
class OperationDiv:Operation
{
public override void GetResult()
{
Console.WriteLine("計算除法時結果為:"+(NumberA/NumberB));
}
}
//【客戶端代碼】
class App
{
static void Main()
{
Operation oper;
oper=OperationFactory.CreateOperation("+");
oper.NumberA=1;
oper.NumberB=2;
oper.GetResult();
}
}
工廠模式實現
【工廠模式】:
using System;
//【運算類】
abstract class Operation //運算基類;
{
public int NumberA;
public int NumberB;
public abstract void GetResult();
}
class OperationAdd:Operation //加法;
{
public override void GetResult()
{
Console.WriteLine("計算加法時結果為:"+(NumberA+NumberB));
}
}
class OperationSub:Operation //減法;
{
public override void GetResult()
{
Console.WriteLine("計算減法時結果為:"+(NumberA-NumberB));
}
}
class OperationMul:Operation //乘法;
{
public override void GetResult()
{
Console.WriteLine("計算乘法時結果為:"+(NumberA*NumberB));
}
}
class OperationDiv:Operation //除法;
{
public override void GetResult()
{
Console.WriteLine("計算除法時結果為:"+(NumberA/NumberB));
}
}
//【Factory接口】
interface IFactory
{
Operation CreateOperaion();
}
//【工廠類】
class AddFactory:IFactory//加法工廠類
{
public Operation CreateOperaion()
{
return new OperationAdd();
}
}
class SubFactory:IFactory//減法工廠類
{
public Operation CreateOperaion()
{
return new OperationSub();
}
}
class MulFactory:IFactory//乘法工廠類
{
public Operation CreateOperaion()
{
return new OperationMul();
}
}
class DivFactory:IFactory//除法工廠類
{
public Operation CreateOperaion()
{
return new OperationDiv();
}
}
//【客戶端代碼】
class App
{
static void Main()
{
//真正體現對接口編程
IFactory operFactory=new AddFactory();//實例化一個加法工廠;
Operation oper=operFactory.CreateOperaion();
oper.NumberA=1;
oper.NumberB=2;
oper.GetResult();
}
}
簡單工廠模式的最大優點在於:工廠類中包含了必要的判斷邏輯,根據客戶端的選擇條件動態實例化相關的類,對於客戶端來說,去除了與具體產品的依賴。
工廠方法模式實現時,客戶端需要決定實例化哪一個工廠來實現運算類,選擇判斷的問題還是存在,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端代碼來進行。你想要加功能,本來是改工廠類的,現在隻改客戶端了。
工廠方法模式克服了簡單工廠模式違背開放-封閉原則,又保持了封裝對象創建過程的優點。工廠方法模式是簡單工廠模式的進一步抽象和推廣。
最後更新:2017-04-02 03:42:39