简单工厂和工厂模式

来源:互联网 发布:注册页面源码 编辑:程序博客网 时间:2024/04/28 09:58

工厂模式】:

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

  }

}

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

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

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小儿说话晚的原因宝宝说话晚怎么办 22岁的儿子在家不说话怎么办 儿子2周4个月了不说话怎么办 三岁的宝宝还不会数数怎么办 2岁宝宝晚上不睡觉不听话怎么办 8个月的狗狗怕人不敢出门怎么办 狗太怕人了怎么办都不敢出门 媳妇和婆婆晚上都不想带孩子怎么办 婆婆和媳妇带孩子观念不一样怎么办 婆婆给媳妇买了不喜欢的家具怎么办 断奶后宝宝对奶粉很抗拒怎么办 两岁宝宝断奶不喝奶粉怎么办 宝宝两岁了断奶后奶粉不吃怎么办 宝宝断奶两天了不愿意吃奶粉怎么办 一岁四个月宝宝断奶不喝奶粉怎么办 四个月宝宝断奶不喝奶粉怎么办 四个月宝宝断奶后不吃奶粉怎么办 2岁的宝宝不开口说话怎么办 一周岁宝宝断奶不喝奶粉怎么办 八个月宝宝断奶不喝奶粉怎么办 婆家人总是用心机对待娘家人怎么办 婆婆老是背后说我娘家人坏话怎么办 婆家姐带孩子住娘家不走怎么办? 老是想在娘家不想回婆家怎么办 娘家和婆家同时向我借钱怎么办 土地确权后娘家婆家都没有怎么办 结了婚婆家向娘家借钱怎么办? 婆婆的娘家人从我家住怎么办 八个月宝宝断奶后不吃奶粉怎么办 吃母乳的宝宝不吸奶嘴怎么办 宝宝吸了奶嘴不吸母乳怎么办 婴儿吃了奶嘴不吸母乳怎么办 十一个月宝宝断奶不喝奶粉怎么办 孩子三门成绩全不及格家长该怎么办 宝宝快十个月了还不会爬怎么办 小孩写字老把手向里扭曲怎么办 孩子该上四年级了数学差的很怎么办 孩子上三年级了数学成绩好差怎么办 三年级数学老考70-80分怎么办 叛逆期的孩子用死来威胁家长怎么办 叛逆期的孩子抽烟喝酒家长该怎么办