菜鸟升级记——简单工厂模式

  大部分的编程学者在碰到问题的时候,就会直觉地用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程,再者就是采用面向对象的语言却做着面向过程的事儿。为了更好地解决这些问题,于是乎《大话设计模式》来啦~
在这里插入图片描述

  • 特性
    • 封装
      定义:每个对象都包含它能进行操作所需要的所有信息
      好处:减少耦合(业务逻辑与界面逻辑分离);类内部的实现可以自由修改;类具有清晰的对外接口
    • 继承
      理解:如果两个对象A和B,可以描述为‘B是A’,则表明B可以继承A。
      记住:如果子类继承于父类,第一、子类拥有父类非private的属性和功能;第二、子类具有自己的属性和功能,即子类可以扩展弗雷没有的属性和功能;第三、子类还可以以自己的方式实现父类的功能(方法重写)
    • 多态
      理解:不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
      在这里插入图片描述
  • 简单工厂模式
    简单工厂模式是属于创建型模式,又叫做静态工厂方法模式。
    简单工厂模式是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(继承自一个父类或接口)的实例。
    • 工厂类Factory:简单工厂模式的核心,在Factory中有一个用于制造产品的create函数(方法),方法体中有一个switch-case语句, 工厂类在客户端的直接调用下根据标识符的不同将具体产品类实例化(创建对象)。
    • 抽象产品类:父类
    • 具体产品类:子类

在这里插入图片描述

OperationLibrary代码

    /// <summary>
    /// 运算类(父类)
    /// </summary>
    public class Operation
    {
        private double _numberA = 0;
        private double _numberB = 0;
        /// <summary>
        /// 数字A
        /// </summary>
        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        /// <summary>
        /// 数字B
        /// </summary>
        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }
        /// <summary>
        /// 得到运算结果
        /// </summary>
        /// <returns></returns>
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
        /// <summary>
        /// 检查输入的字符串是否准确
        /// </summary>
        /// <param name="currentNumber">文本框中显示的数字</param>
        /// <param name="inputString">刚点击的数字</param>
        /// <returns></returns>
        public static string checkNumberInput(string currentNumber,string inputString)
        {
            string result = "";
            if (inputString == ".")//如果点击的是小数点
            {
                //indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置              
                if (currentNumber.IndexOf(".") < 0)//检索已经输入的字符串中"."是否出现,如果要检索的字符串值没有出现,则返回-1
                {
                    if (currentNumber.Length == 0)//如果之前没有输入字符,在"."前面加个0,即"0."
                        result = "0" + inputString;
                    else
                        result = currentNumber + inputString;//之前输入过字符(数字),则"数字.",例"9."
                }
            }
            else if (currentNumber == "0")//如果之前输入的字符是0
            {
                result = inputString;
            }
            else
            {
                result = currentNumber + inputString;//累加两个值
            }
            return result;
        }
    }
    /// <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>
    class OperationSqr : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberB * NumberB;
            return result;
        }
    }
    /// <summary>
    /// 平方根类
    /// </summary>
    class OperationSqrt : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB < 0)
                throw new Exception("负数不能开平方根");
            result = Math.Sqrt(NumberB);//对NumberB进行开平方
            return result;
        }
    }
    /// <summary>
    /// 相反数类
    /// </summary>
    class OperationReverse : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = -NumberB;
            return result;
        }
    }
    /// <summary>
    /// 简单运算工厂类
    /// </summary>
    public class OperationFactory
    {
        public static Operation creatOperate(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;
                    }
                case "sqr":
                    {
                        oper = new OperationSqr();
                        break;
                    }
                case "sqrt":
                    {
                        oper = new OperationSqrt();
                        break;
                    }
                case "+/-":
                    {
                        oper = new OperationReverse();
                        break;
                    }
            }
            return oper;
        }
    }

计算器客户端代码

    /// <summary>
    /// 面向对象编程
    /// 1、加运算类
    /// 2、加运算子类
    /// 3、加运算类工厂
    /// 4、更改Form1
    /// </summary>
    public partial class Form1 : Form
    {
        bool bOperate = false;
        Operation oper;
        public Form1()
        {
            InitializeComponent();
        }

        private void button0_Click(object sender, EventArgs e)
        {
            if (bOperate)
            {
                txtShow.Text = "";
                bOperate = false;
            }
            //sender引发事件的对象 
            //(Button)sender强制类型转换为Button类型
            string number = ((Button)sender).Text;//获取激发该事件的Button的文本值

            txtShow.Text = Operation.checkNumberInput(txtShow.Text, number);
        }

        private void buttonClear_Click(object sender, EventArgs e)
        {
            txtShow.Text = "";
        }

        private void buttonAdd_Click(object sender, EventArgs e)
        {
            if (txtShow.Text != "")
            {
                oper = OperationFactory.creatOperate(((Button)sender).Text);

                oper.NumberA = Convert.ToDouble(txtShow.Text);

                bOperate = true;
            }
        }

        private void buttonEqual_Click(object sender, EventArgs e)
        {
            if (txtShow.Text != "")
            {
                if (((Button)sender).Text != "=")
                {
                    oper = OperationFactory.creatOperate(((Button)sender).Text);
                }
                oper.NumberB = Convert.ToDouble(txtShow.Text);

                txtShow.Text = oper.GetResult().ToString();
                bOperate = true;
            }
        }
    }

  编程是一门技术,更是一门艺术。路漫漫其修远兮,吾将上下而求索。

猜你喜欢

转载自blog.csdn.net/Ellen5203/article/details/85200580
今日推荐