閱讀699 返回首頁    go 汽車大全


簡單工廠和工廠模式

工廠模式】:

     定義一個用於創建對象的接口, 讓子類決定實例化哪一個類。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

  上一篇:go JavaScript文本框的操作
  下一篇:go 代理模式