设计模式之----简单工厂模式

 工厂模式(Factory Patttern)是属于设计模式中的创建型模式,附上一张个人整理的设计模式

首先用一个简单的计算器例子来演示

 class Program
    {
        #region "普通运算方法"
         private static double Calcutelate(double num1,string oper,double num2)
         {
             double result=0;
             switch (oper)
             {
                 case "+":
                     result = num1   + num2;

                     break;
                 case "-":
                     result = num1 - num2;
                     break;
                 case "*":
                     result = num2 * num1;
                     break;
                 case "/":
                     if (num2 != 0)
                     {
                         result = num1 / num2;
                     }
                     else
                     {
                         Console.WriteLine("除数不能为0");
                     }

                     break;
             }
             return result;
         }
         static void Main(string[] args)
         {

             try
             {
                 Console.WriteLine("请输入第一个数字:");
                 double Num1 = double.Parse(Console.ReadLine());
                 Console.WriteLine("请输入你想进行的操作,+,-,*,/");
                 string Oper = Console.ReadLine();
                 Console.WriteLine("请输入第二个数字:");
                 double Num2 = double.Parse(Console.ReadLine());
                 double result = Calcutelate(Num1, Oper, Num2);
                 Console.WriteLine("输出结果为:{0}", result);

             }catch(Exception e)
             {
                 Console.WriteLine("您的输入有误:{0}", e.Message);
             }



         }
        #endregion
    }

这是一个简单计算器例子,但是当需要在运算方法里面进行一些操作的时候,可能会对内部的一些代码发生变化,所以我们应该将其分离出来。

   /// <summary>
    /// 获取数字并且用来计算结果
    /// </summary>
    public class Operation
    {
        private double _numBerOne = 0;
        private double _numBerTow = 0;

        public double NumBerOne { get => _numBerOne; set => _numBerOne = value; }
        public double NumBerTow { get => _numBerTow; set => _numBerTow = value; }
        

        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

    class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumBerOne + NumBerTow;
            return result;
        }
    }
    class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumBerOne - NumBerTow;
            return result;
        }
    }
    class OperationMul : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumBerOne * NumBerTow;
            return result;
        }
    }
    class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumBerTow == 0)
                throw new Exception("除数不能为0");
            result = NumBerOne / NumBerTow;
            return result;
        }
    }

使用了虚方法用来重写计算结果的方法,加减乘除都继承了Operation类,既然每个运算符得类都有了,那接下来就需要一个类(工厂)来专门创建实例

 public class OperationFactory
    {
        public static Operation Calculate(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;

        }
    }

每个运算符对应其相应的实例,这样如果需要加功能的话可以对应的加,而且不会影响到其他的操作。附上剩下的代码

 class Client
    {
        static void Main()
        {
            Operation oper;
            oper = OperationFactory.Calculate("+");
            oper.NumBerOne = 1;
            oper.NumBerTow = 2;
            double result = oper.GetResult();
            Console.WriteLine("结果为:{0}", result);
        }
    }

对一个拥有多种操作并且这些操作都是分离的并且不会影响到各自的对象可以将其拆分成对应的实例,使其能够独立开来并且修改其操作不会对内部代码有影响。

 如果有错误希望dalao能纠正,个人在学习中。

posted @ 2019-07-23 21:55  RpeatAndRepat  阅读(217)  评论(0)    收藏  举报