C#简单的工厂模式实例

简单的工厂模式实例


使用到面向对象的三大性质:封装,继承,多态。
封装思路:将需要各个部分独立出去,创建各自的类,做到“牵一发而不动全身”。
继承思路:将种类功能相同的类归纳总结成一个类来作为父类,以供其它的子类继承。
多态思路:在父类中将一些子类中形式但是规则特异的方法定义为虚方法,以便于子类中重写该方法用以子类自己的规则,以及在创建父类对象时,使用父类方法签名调用子类方法实体。
本文参考: 《大话设计模式》

namespace _006_工厂模式
{
    class Program
    {
        #region 硬写一个计算器
        //写一个接收用户输入+-*/的 计算器
        static void Main01(string[] args)
        {
            //提问:1、程序出现异常怎么办:将程序写进try catch块中
            int num01 = 0;
            int num02 = 0;
            int result = 0;
            string option = "";
            //提问:1、输入值不规范怎么办:单独写出方法进行判断。
            //     2、遇到各个运算法则自身的规则怎么办:写一个运算方法类来管理这些预算法则。
            Console.Write("请输入第一个数");
            num01 = Convert.ToInt32(Console.ReadLine());
            Console.Write("请输入第二个数");
            num02 = Convert.ToInt32(Console.ReadLine());
            Console.Write("请输入需要进行的运算操作符");
            option = Console.ReadLine();
            switch (option)
            {
                case "+":
                    result = num01 + num02;
                    break;
                case "-":
                    result = num01 - num02;
                    break;
                case "*":
                    result = num01 * num02;
                    break;
                case "/":
                    result = num01 / num02;
                    break;
            }
            Console.WriteLine(result.ToString());
            Console.ReadKey();
        }
        #endregion

        #region 在面向对象的思想中使用简单工厂写一个计算器
        public static void Main()
        {
            //规则:使用到面向对象的三大性质:封装,继承,多态。
            //封装思路:将需要各个部分独立出去,创建各自的类,做到“牵一发而不动全身”。
            //继承思路:将种类功能相同的类归纳总结成一个类来作为父类,以供其它的子类继承。
            //多态思路:在父类中将一些子类中形式但是规则特异的方法定义为虚方法,以便于子类中重写该方法用以子类自己的规则,以及在创建父类对象时,使用父类方法签名调用子类方法实体。
            //工程分析:在计算器自身的工作流程为:接受用户输入的数字与计算法则;计算;输出计算结果
            Opertion myOpe=new Opertion();
            myOpe = OpertionFactory.creatOpertion("+");
            myOpe.NUM01 = 1;
            myOpe.NUM02 = 2;
            Console.WriteLine(myOpe.GetResult());
            Console.ReadKey();

        }

        //接受用户输入的数字与运算法则类。
        public class Opertion
        {
            private double num01 = 0;
            private double num02 = 0;
            public double NUM01
            {
                get { return num01; }
                set { num01 = value; }
            }
            public double NUM02
            {
                get { return num02; }
                set { num02 = value; }
            }
            public virtual double GetResult()
            {
                double result = 0;
                return result;
            }
        }
        //加法
        class OpertioAdd : Opertion
        {
            public override double GetResult()
            {
                double result = 0;
                result = NUM01 + NUM02;
                return result;
            }
        }
        //减法
        class OpertioSubtruct : Opertion
        {
            public override double GetResult()
            {
                double result = 0;
                result = NUM01 - NUM02;
                return result;
            }
        }
        //乘法
        class OpertioMultiply : Opertion
        {
            public override double GetResult()
            {
                double result = 0;
                result = NUM01 * NUM02;
                return result;
            }
        }
        //除法
        class OpertioDivision : Opertion
        {
            public override double GetResult()
            {
                double result = 0;
                if (NUM02 == 0) throw new Exception("分母不能为0");
                result = NUM01 / NUM02;
                return result;
            }
        }
        
        //简单工厂类:用于创建需要选择的运算法则,在中间步骤创建为子类的实例,将父类中的方法多态为子类中的方法,来使得在使用父类对象调用该方法的时候实际调用的是子类的方法体。
        public class OpertionFactory
        {
            /// <summary>
            /// 返回创建的运算法则
            /// </summary>
            /// <param name="operate">输入的预算法则符号</param>
            /// <returns></returns>
            public static Opertion creatOpertion(string operate)
            {
                Opertion ope = null;
                switch (operate)
                {
                    case "+":
                        ope = new OpertioAdd();
                        break;
                    case "-":
                        ope = new OpertioSubtruct();
                        break;
                    case "*":
                        ope = new OpertioMultiply();
                        break;
                    case "/":
                        ope = new OpertioDivision();
                        break;
                    default:
                        break;
                }
                return ope;
            }
        }

        #endregion
    }
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值