• 大话设计模式:第一章简单工厂模式


      面向对象的三大特性:封装,继承,多态。

    本文只是第一章计算器例子的源代码分享:

    1,定义一个运算基类,所有的运算都继承自它:

        /// <summary>
        /// 所有运算的基类
        /// </summary>
        class Operation
        {
            public double NumberA;
            public double NumberB;     
            /// <summary>
            /// 计算结果让子类重写
            /// </summary>        
            public virtual double GetResult()
            {
                double result=0d;
                return result;
            }
        }

    2,定义所有的运算类,继承自运算基类Operation

    View Code
        /// <summary>
        /// 下面的类都继承自Operation,重载了GetResult()
        /// </summary>
        class OperationAdd : Operation
        {
            public override double GetResult()
            {
                return (NumberA + NumberB);     
            }
        }
        class OperationSub : Operation
        {
            public override double GetResult()
            {
                return (NumberA - NumberB);
            }
        }
        class OperationMul : Operation
        {
            public override double GetResult()
            {
                return (NumberA * NumberB);
            }
        }
        class OperationDiv : Operation
        {
            public override double GetResult()
            {
                if (NumberB == 0)
                    throw new Exception("除数不能为0");
                return (NumberA / NumberB);
            }
        }

    3,定义一个简单工厂类,决定实例化哪一个对象:

    View Code
        /// <summary>
        /// 简单工厂类,判断创建哪一个实例
        /// </summary>
        class OperationFactory
        {       
            /// <summary>
            /// 根据运算符判断实例化哪个对象,静态方法可以直接调用
            /// </summary>
            /// <param name="opr">运算符</param>
            /// <returns>被实例化的运算对象</returns>
            public static Operation CreateObject(string opr)
            {
                Operation OpeObject = null;
                switch (opr)
                {
                    case "+":
                        OpeObject = new OperationAdd();
                        break;
                    case "-":
                        OpeObject = new OperationSub();
                        break;
                    case "*":
                        OpeObject = new OperationMul();
                        break;
                    case "/":
                        OpeObject = new OperationDiv();
                        break;                    
                }
                return OpeObject;
            }        
        }

    4,在Main方法中测试:

    View Code
        class Program
        {
            static void Main(string[] args)
            {
                while (true)
                {
                    try
                    {
                        Console.WriteLine("请输入两个数(每行一个):");
                        string NumberA = Console.ReadLine();
                        string NumberB = Console.ReadLine();
                        Console.WriteLine("请输入运算符+,-,*,/");
                        string Opr = Console.ReadLine();
    
                        Operation ope = OperationFactory.CreateObject(Opr);
                        ope.NumberA = Convert.ToDouble(NumberA);
                        ope.NumberB = Convert.ToDouble(NumberB);
    
                        string rusult = Convert.ToString(ope.GetResult());
                        Console.WriteLine("运算结果是:{0}", rusult);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }        
            }
        }        
  • 相关阅读:
    性能测试之开源的性能监控软件
    POJ 2553 The Bottom of a Graph TarJan算法题解
    Spring AOP切面
    [2014.5.22][UBUNTU]Ubuntu与Windows系统时间不同步的问题
    MySQL bug:server-id默认被自己主动置为1
    [Android]Fragment源代码分析(二) 状态
    window nginx 启动无提示错误,却没有listen 80port
    Shell 命令--文件创建、搜索命令--总结自《Linux Shell 脚本攻略》
    freemarker 自己定义指令
    javascript Deferred和递归次数限制
  • 原文地址:https://www.cnblogs.com/wang7/p/2679698.html
Copyright © 2020-2023  润新知