【软件基础】简单计算器的实现+工厂方法模式应用+封装、继承、多态的体现

文章介绍了如何使用工厂方法模式实现一个简单的计算器,通过将运算符(加、减、乘、除)与对应的运算类关联,降低了代码的耦合度,增强了系统的可维护性和扩展性。文章展示了工厂方法模式的代码实现,包括工厂抽象类和具体工厂类,以及运算操作的抽象类和具体实现。对比了简单工厂模式,强调了工厂方法模式在应对产品类变化时的优势。
摘要由CSDN通过智能技术生成


前言

工厂方法模式是一种常用的创建型设计模式,它提供了一种将对象的创建过程封装起来的方法。在工厂方法模式中,将对象的创建过程交给一个工厂类来完成,而不是在代码中直接调用构造函数来创建对象。这样可以使得代码更加灵活,降低耦合度,方便后期维护和扩展。

工厂方法模式的核心思想是定义一个工厂接口,该接口包含一个创建产品的方法。具体的产品创建由实现该接口的具体


一、运行效果

实现计算器的加减乘数计算。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 计算器_工厂方法模式
{
    class Program
    {
        //分析:将+、-、*、/四种运算分为四大类,每种类中的属性和方法类似,因此可使用操作抽象类
        //在创建类对象的时候使用工厂方法模式,即建一个工厂抽象类,不同的运算创建新的工厂类,不同的类分在不同的工厂中制造
        //这样子的好处是,创建不同类的工厂单独的方式修改,不会引起同类型其他工厂类的使用

        static void Main(string[] args)
        {
            Console.WriteLine("请输入运算符:\r\n");

            string operChar = Console.ReadLine();

            Operation oper = null; ;

            switch (operChar)
            {
                case "+":
                    {
                        FactoryOperationAdd facAdd = new FactoryOperationAdd();
                        oper = facAdd.creatOperation(operChar);
                        break;
                    }
                case "-":
                    {
                        FactoryOperationSub facSub = new FactoryOperationSub();
                        oper = facSub.creatOperation(operChar);
                        break;
                    }
                case "*":
                    {
                        FactoryOperationMul facMul = new FactoryOperationMul();
                        oper = facMul.creatOperation(operChar);
                        break;
                    }
                case "/":
                    {
                        FactoryOperationDiv facDiv = new FactoryOperationDiv();
                        oper = facDiv.creatOperation(operChar);
                        break;
                    }
            }

            Console.WriteLine("请输入第一个数:\r\n");
            oper.NumberA = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("请输入第二个数:\r\n");
            oper.NumberB = Convert.ToDouble(Console.ReadLine());

            double result = oper.GetResult();

            Console.WriteLine("计算结果是:" + oper.NumberA + operChar + oper.NumberB + "=" + result.ToString());
            Console.ReadKey();
        }

        class Operation
        {
            private double _numberA = 0;
            private double _numberB = 0;

            public double NumberA
            {
                get { return _numberA; }
                set { _numberA = value; }
            }

            public double NumberB
            {
                get { return _numberB; }
                set { _numberB = value; }
            }

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

        class OperationAdd : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA + NumberB;
                return result;
            }
        }

        class OperationSub : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA - NumberB;
                return result;
            }
        }

        class OperationMul : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA * NumberB;
                return result;
            }
        }

        class OperationDiv : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA / NumberB;
                return result;
            }
        }

        /// <summary>
        /// 工厂抽象基类
        /// </summary>
        abstract class Factory
        {
            public abstract Operation creatOperation(string oper);
        }

        class FactoryAdd : Factory
        {
            public override Operation creatOperation(string oper)
            {
                OperationAdd operAdd = new OperationAdd();
                return operAdd;
            }
        }

        class FactorySub : Factory
        {
            public override Operation creatOperation(string oper)
            {
                OperationSub operSub = new OperationSub();
                return operSub;
            }
        }

        class FactoryMul : Factory
        {
            public override Operation creatOperation(string oper)
            {
                OperationDiv operDiv = new OperationDiv();
                return operDiv;
            }
        }

        class FactoryOperationAdd:Factory
        {
            public override Operation creatOperation(string oper)
            {
                Operation operation = null;
                switch (oper)
                {
                    case "+":
                        {
                            operation = new OperationAdd();
                            break;
                        }
                }
                return operation;
            } 
        }

        class FactoryOperationSub : Factory
        {
            public override Operation creatOperation(string oper)
            {
                Operation operation = null;
                switch (oper)
                {
                    case "-":
                        {
                            operation = new OperationSub();
                            break;
                        }
                }
                return operation;
            }
        }

        class FactoryOperationMul : Factory
        {
            public override Operation creatOperation(string oper)
            {
                Operation operation = null;
                switch (oper)
                {
                    case "*":
                        {
                            operation = new OperationMul();
                            break;
                        }
                }
                return operation;
            }
        }

        class FactoryOperationDiv : Factory
        {
            public override Operation creatOperation(string oper)
            {
                Operation operation = null;
                switch (oper)
                {
                    case "/":
                        {
                            operation = new OperationDiv();
                            break;
                        }
                }
                return operation;
            }
        }
    }
}

三、简单工厂模式代码对比

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            OperationFactory operF;
            Operation oper;

            Console.WriteLine("请输入运算符:\r\n");
            string operChar=Console.ReadLine();

            operF = new OperationFactory();
            oper = operF.creatOperation(operChar);

            Console.WriteLine("请输入第一个数:\r\n");
            oper.NumberA = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("请输入第二个数:\r\n");
            oper.NumberB = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("运算结果为:\r\n");

            double result = oper.GetResult();
            Console.WriteLine(oper.NumberA.ToString() + operChar + oper.NumberB + "=" + result.ToString());

            Console.ReadKey();
        }
    }

    class Operation     //运算基类
    { 
        //定义两个数的属性
        private double _numberA = 0;
        private double _numberB = 0;

        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }

        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }

        public virtual double GetResult()   //定义虚方法
        {
            double result = 0;
            return result;
        }
    }

    class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }

    class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }

    class OperationMul : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }

    class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA / NumberB;
            return result;
        }
    }

    /// <summary>
    /// 简单工厂创建对象,但一旦一个类的操作方式改变,整个工厂类都要改变,违反高内聚原则
    /// </summary>
    class OperationFactory      //运算对象生产工厂
    {
        public Operation creatOperation(string operation)
        {
            Operation oper = null;
            switch (operation)
            {
                case "+":
                    {
                        oper = new OperationAdd();
                        break;
                    }
                case "-":
                    {
                        oper = new OperationSub();
                        break;
                    }
                case "*":
                    {
                        oper = new OperationMul();
                        break;
                    }
                case "/":
                    {
                        oper = new OperationDiv();
                        break;
                    }   
            }
            return oper;
        }
    }
}


总结

工厂模式相对于简单工厂模式来说,针对每个产品类都有对应的产品工厂,这样每一类产品变动导致的工厂变动,只在对应的工厂中变动就可以。降低了耦合性,提高了内聚性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的计算器控制台程序的示例,它体现了面向对象的基本原则,包括继承封装多态等。 ```python import operator class Calculator: def __init__(self, op): self.op = op def calculate(self, a, b): return self.op(a, b) class Add(Calculator): def __init__(self): super().__init__(operator.add) class Subtract(Calculator): def __init__(self): super().__init__(operator.sub) class Multiply(Calculator): def __init__(self): super().__init__(operator.mul) class Divide(Calculator): def __init__(self): super().__init__(operator.truediv) class Modulus(Calculator): def __init__(self): super().__init__(operator.mod) class Power(Calculator): def __init__(self): super().__init__(operator.pow) class CalculatorConsole: operations = { "+": Add(), "-": Subtract(), "*": Multiply(), "/": Divide(), "%": Modulus(), "^": Power() } def run(self): while True: try: expression = input("Enter an expression (e.g. 2 + 3): ") if expression == "exit": break a, op, b = expression.split() a = float(a) b = float(b) if op not in self.operations: raise ValueError("Invalid operator") result = self.operations[op].calculate(a, b) print(result) except Exception as e: print("Error:", e) if __name__ == "__main__": calc = CalculatorConsole() calc.run() ``` 在这个程序中,首先定义了一个名为`Calculator`的基,它接受两个参数并返回它们的运算结果。然后定义了几个继承自`Calculator`的子,例如`Add`,`Subtract`等,它们分别执行不同的运算操作,如加法、减法等。这里使用了Python标准库中的`operator`模块来实现这些运算操作。 接下来定义了一个`CalculatorConsole`,它包含一个静态字典`operations`,将不同的运算符映射到相应的运算子。该还包含一个`run`方法,它从用户输入中解析出表达式,并使用反射机制来查找并调用相应的运算子,最后输出计算结果。 这个程序的结构可以用UML图表示如下: ``` +-------------------+ | Calculator | +-------------------+ | -op: function | +-------------------+ | +calculate() | +-------------------+ ^ | +-------+-------+ | | | Add | | | +---------------+ | +__init__() | +---------------+ ^ | +-------+-------+ | | | Subtract | | | +---------------+ | +__init__() | +---------------+ ^ | +-------+-------+ | | | Multiply | | | +---------------+ | +__init__() | +---------------+ ^ | +-------+-------+ | | | Divide | | | +---------------+ | +__init__() | +---------------+ ^ | +-------+-------+ | | | Modulus | | | +---------------+ | +__init__() | +---------------+ ^ | +-------+-------+ | | | Power | | | +---------------+ | +__init__() | +---------------+ +-------------------+ | CalculatorConsole| +-------------------+ | -operations: dict | +-------------------+ | +run() | +-------------------+ ``` 在这个图中,`Calculator`是一个抽象基,它定义了一个`calculate`方法,用于执行两个数的运算。`Add`、`Subtract`等子继承自`Calculator`,并实现了不同的运算逻辑。 `CalculatorConsole`是一个控制台程序,它包含一个静态字典`operations`,映射不同的运算符到相应的子。`run`方法从用户输入中解析出表达式,查找相应的子并调用`calculate`方法计算结果。 这个程序的设计遵循了面向对象的基本原则,例如继承封装多态等,使得它易于扩展和复用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值