设计模式-简单工厂模式

- 原创

        在编程的过程中,尽可能的把代码的业务逻辑与界面分开,并且精心维护好自己的代码,经常去优化更新,这样可以提高以后的工作效率,在下次在写类似的功能的时候就可以将代码拿过来复用。

        面向对象的三大特效是封装,继承,多态,通过这3大特性可以把程序的耦合度降低,今天我要分享的设计模式叫”简单工厂模式“,用设计模式的好处是可以让程序变化的更加容易修改,更加容易复用。

        以计算器的程序为例子:

        封装业务类,将业务逻辑与界面分开,降低耦合度。


        首先封装一个运算类,定义一个GetResult的虚方法。

 /// <summary>
    ///运算类
    /// </summary>
    public class Operation
    {
        public double NumberA { get; set; }

        public double NumberB { get; set; }

        /// <summary>
        /// 定义一个虚方法
        /// virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:
             ///情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。
             ///情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。
        /// </summary>
        /// <returns></returns>
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

           然后定义各种运算的子类,继承Operation类,并重写GetResult方法

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

然后在定义一个简单工厂类

/// <summary>
    /// 简单工厂类
    /// 描述:简单工厂模式
    /// </summary>
    public class OperationFactory
    {
        public static Operation CreaterOperate(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版程序,或者是手机等需要用到计算器的软件都可以复用这样的代码。

static void Main(string[] args)
        {
            Console.WriteLine("请输入一个数");
            double NumberA = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("请输入运算符");
            string strOperate = Console.ReadLine();
            Console.WriteLine("请输入第二个数");
            double NumberB = Convert.ToDouble(Console.ReadLine());
            Operation oper;
            oper = OperationFactory.CreaterOperate(strOperate);
            oper.NumberA = NumberA;
            oper.NumberB = NumberB;
            double result = oper.GetResult();
            Console.WriteLine("结果{0}",result);
            Console.ReadKey();        
        }