1. 程式人生 > >簡單工廠和工廠模式

簡單工廠和工廠模式

工廠模式】:定義一個用於建立物件的介面, 讓子類決定例項化哪一個類。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

void GetResult();

}

classOperationAdd:Operation

{

publicoverridevoid GetResult()

   {

Console.WriteLine("計算加法時結果為:"+(NumberA+NumberB));

   }

}

classOperationSub:Operation

{

publicoverridevoid GetResult()

   {

Console.WriteLine("計算減法時結果為:"+(NumberA-NumberB));

   }

}

classOperationMul:Operation

{

public

overridevoid GetResult()

   {

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();

  }

}

簡單工廠模式的最大優點在於:工廠類中包含了必要的判斷邏輯,根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴。

工廠方法模式實現時,客戶端需要決定例項化哪一個工廠來實現運算類,選擇判斷的問題還是存在,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端程式碼來進行。你想要加功能,本來是改工廠類的,現在只改客戶端了。

工廠方法模式克服了簡單工廠模式違背開放-封閉原則,又保持了封裝物件建立過程的優點。工廠方法模式是簡單工廠模式的進一步抽象和推廣。