[设计模式]简单工厂模式

来源:互联网 发布:阿里云信任付怎么还款 编辑:程序博客网 时间:2024/05/17 23:08

前言

        简单工厂模式是《大话设计模式》中的第一个模式,又叫做静态工厂方法(Static Factory Method)模式,它不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。也就是说,一个程序中,到式底要实例化谁,将来会不会增加实例化的对象,增加一些容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。


内容

        业务的封装就是将业务逻辑和界面逻辑分开,减低它们之间的耦合度,这样可以达到容易维护或扩展。

        封装后代码:

namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            try            {                Console.Write("请输入数字A:");                string strNumberA = Console.ReadLine();                Console.Write("请选择运算符号(+、-、*、/):");                string strOperate = Console.ReadLine();                Console.Write("请输入数字B:");                string strNumberB = Console.ReadLine();                string strResult = "";                strResult = Convert.ToString(Operation.GetResult (Convert.ToDouble(strNumberA),Convert .ToDouble (strNumberB),strOperate ));                Console.WriteLine("结果是:"+strResult );                Console.ReadLine();            }            catch (Exception ex)            {                Console.WriteLine("您输入的有错:" + ex.Message);            }        }    }    public class Operation    {        public static double GetResult(double numberA, double NumberB, string operate)        {            double result = 0d;            switch (operate)            {                case"+":                    result = numberA + NumberB;                    break;                case"-":                    result = numberA - NumberB;                    break;                case"*":                    result = numberA * NumberB;                    break;                case "/":                     result = numberA / NumberB;                    break;            }            return result;        }    }}

        上面代码很漂亮,但并不是最优的。若是想再加一个运算类直接改Operation类就可以了,但是若新的运算类需要调用加减乘除方法就不好改了。所以应该把加减乘数等运算类分离。


        分离后代码:

    public 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; }        }        public virtual double GetResult()        {            double result = 0;            return result;        }    }    //加法类,继承运算类    class OperationAdd : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA + NumberB;            return result;        }    }    //减法类,继承运算类    class OperationSub : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA - NumberB;            return result;        }      }    //乘法类    class OperationMul : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA * NumberB;            return result;        }    }    //除法类    class OperationDiv : Operation    {        public override double GetResult()        {            double result = 0;            if (NumberB==0)            {                throw new Exception("除数不能为0");            }            result = NumberA / NumberB;            return result;        }    }}

      

        上面代码有两个Number属性,主要用于计算器的前后数,然后有一个虚方法GetResult(),用于得到的结果,然后把加减乘数携程运算类的子类,继承它后重写了GetResult()方法,这样若修改任何一个算法,就不需要提供其他算法的代码了。但是如何让计算器知道希望调用的是哪一个算法呢?

这个时候就需要用到简单工厂模式了。

        客户端代码:

        static void Main(string[] args)        {            Operation oper;            oper = OperationFactory.createOperate("+");            oper.NumberA = 1;            oper.NumberB = 2;            double result = oper.GetResult();        }


上面代码有两个Number属性,主要用于计算器的前后数,然后有一个虚方法GetResult(),用于得到的结果,然后把加减乘数携程运算类的子类,继承它后重写了GetResult()方法,这样若修改运算类代码:

    public class OperationFactory    {        public static Operation createOperate(string operate)        {            Operation oper = null;            switch (operate)            {                case"+":                    oper = new OperationAdd();                    break;                case "-":                    oper = new OperationSub();                    break;                case "*":                    oper = new OperationMul();                    break;                case "/":                    oper = new OperationDiv();                    break;            }            return oper;        }    }


        这样只需要输入运算符号,工厂就可以实例化出合适的对象,通过多态,返回父类的方式实现了计算器的结果。
        不管是控制台程序、Windows程序,Web程序,PDA或者手机程序,都可以用这段代码实现计算器的功能,若果需要更改某运算,只需更改某运算的类就好了,需要增加各种复杂运算时,只需增加相应的子类就可以了。
        当然,修改界面直接修改就好了,和程序代码没有关系。


总结

        通过简单工厂模式让我彻底的认识到之前写代码的不足,若是不懂这些东西,修改程序(增加或者修改模块)大都需要全部推翻重来。面向对象原来这么神奇,让我领略到了编程的思想。

        就像书上说的:“编程是一门技术,更加是一门艺术。”




1 0
原创粉丝点击