简单工厂和工厂模式

工厂模式】:

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

  }

}

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单工厂模式和抽象工厂模式是两种不同的创建型设计模式,它们在实现上有一些区别。 简单工厂模式(Simple Factory Pattern): - 简单工厂模式通过一个工厂类来创建对象,客户端通过调用工厂类的静态方法或非静态方法来获取所需的具体产品对象。 - 工厂类根据客户端传入的参数来决定创建哪种具体产品的对象。 - 简单工厂模式只有一个具体工厂类,负责创建所有类型的产品对象。 抽象工厂模式(Abstract Factory Pattern): - 抽象工厂模式通过引入一个抽象工厂接口和多个具体工厂类来创建对象。 - 抽象工厂接口定义了一系列创建产品的方法,每个具体工厂类负责实现这些方法以创建特定类型的产品对象。 - 客户端通过使用特定的具体工厂类来创建一组相关的产品对象,这样可以保证这些产品对象在一起使用时能够协调和兼容。 主要区别: - 简单工厂模式只有一个工厂类,所有产品的创建逻辑集在该类。而抽象工厂模式引入了多个具体工厂类,每个具体工厂类负责创建一组相关的产品。 - 简单工厂模式创建的是单个产品对象,而抽象工厂模式创建的是一组相关的产品对象。 - 简单工厂模式的客户端只与工厂类交互,而抽象工厂模式的客户端与抽象工厂接口以及具体工厂类交互。客户端可以通过替换具体工厂类来改变创建不同产品的行为。 选择使用简单工厂模式还是抽象工厂模式取决于具体的应用场景和需求。简单工厂模式适用于创建单一类型的产品对象,而抽象工厂模式适用于创建一组相关的产品对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值