简单工厂和工厂模式

工厂模式】:

     定义一个用于创建对象的接口, 让子类决定实例化哪一个类。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();

  }

}

      简单工厂模式的最大优点在于:工厂类中包含了必要的判断逻辑,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类的,现在只改客户端了。

工厂方法模式克服了简单工厂模式违背开放-封闭原则,又保持了封装对象创建过程的优点。工厂方法模式是简单工厂模式的进一步抽象和推广。

原文地址:https://www.cnblogs.com/zhangqs008/p/2802260.html