大话设计模式,让你的代码更完美4---简单工厂模式和工厂方法模式

来源:互联网 发布:修改php端口号 编辑:程序博客网 时间:2024/06/01 23:25

在之前的文章中简单的阐述了一下简单工厂模式。

在这里要说一个新的模式,与其类似但又不同,叫做工厂方法模式。


简单工厂模式(具体的代码翻看第一章,这里只说一下比较重要的部分):

结构图:


工厂类代码:

public class OperationContest  {      Operation open;      public OperationContest(string operate)      {            switch (operate)          {              case "+":                  {                      open = new OperationAdd();                      break;                  }              case "-":                  {                      open = new OperationSub();                      break;                  }              case "*":                  {                      open = new OperationMul();                      break;                  }              case "/":                  {                      open = new OperationDiv();                      break;                  }          }      }      public double GetResult()      {          return open.GetResult();      }  }  

主函数代码:

               Operation oper;                 oper = OperationFactory.createOperate(strOperate);                 oper.NumberA = Convert.ToDouble(strNumberA);                 oper.NumberB = Convert.ToDouble(strNumberB);                 strResult = oper.GetResult().ToString();  


工厂方法模式:

结构图:


创建工厂接口代码:

    interface IFactory    {        Operation CreateOperation();    }
创建负责加减乘除的工厂代码:
    /// <summary>    /// 专门负责生产“+”的工厂    /// </summary>    class AddFactory : IFactory    {        public Operation CreateOperation()        {            return new OperationAdd();        }    }    /// <summary>    /// 专门负责生产“-”的工厂    /// </summary>    class SubFactory : IFactory    {        public Operation CreateOperation()        {            return new OperationSub();        }    }

创建加减

    /// <summary>    /// 加法类    /// </summary>    class OperationAdd : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA + NumberB;            return result;        }    }    /// <summary>    /// 减法类    /// </summary>    class OperationSub : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA - NumberB;            return result;        }    }

运算类:

    class Operation    {        private double _numberA = 0;        private double _numberB = 0;        public double NumberA        {            get { return _numberA; }            set { _numberA = value; }        }        public double NumberB        {            get { return _numberB; }            set { _numberB = value; }        }        /// <summary>        /// 得到运算结果        /// </summary>        /// <returns></returns>        public virtual double GetResult()        {            double result = 0;            return result;        }    }

主函数:

            IFactory operFactory = new AddFactory();            Operation oper = operFactory.CreateOperation();            oper.NumberA = 1;            oper.NumberB = 2;            double result=oper.GetResult();

代码流程:

声明一个工厂类接口,但实例化一个加法运算工厂类。(工厂类是加法工厂类的父类)

调用加法工厂对象,创建运算类,设置相关参数,通过GetResoult获取计算结果


对比发现:

简单工厂类的优点:包含了必备的逻辑处理(switch),根据客户端的条件动态去实例化相关类,对于客户端来说去除了与具体产品的依赖。

简单工厂类的缺点:如果要加一个乘法运算,必须要修改工厂类(switch里的case条件),这样相当于扩展开放了,修改也开放了,违反开放-封闭原则。


工厂方法模式的优点:含有简单工厂模式的优点,且新增功能时不用修改工厂类,扩展性好显而易见。

工厂方法模式的缺点:比简单工厂类的代码少许复杂.

具体实现如下,当需要添加乘法运算模块时,我们只需要添加2个类,一个是乘法的工厂类,一个是乘法的具体实现类。

乘法工厂类:

    /// <summary>    /// 专门负责生产“*”的工厂    /// </summary>    class MulFactory : IFactory    {        public Operation CreateOperation()        {            return new OperationMul();        }    }

乘法实现类:

    /// <summary>    /// 乘法类    /// </summary>    class OperationMul : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA * NumberB;            return result;        }    }
主函数:

            //IFactory operFactory = new AddFactory();            IFactory open = new MulFactory();            Operation oper = open.CreateOperation();            oper.NumberA = 1;            oper.NumberB = 2;            double result=oper.GetResult();

是否发现这种实现方式根本就不用修改任何的工厂类,只需要在调用的时候更改一下所要new出的对象就可以了,就能达到我们所期盼的结果。


这就是学习的过程,每天进步一点点,美滋滋!



0 0
原创粉丝点击