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

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

前言

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

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


一、运行效果

实现计算器的加减乘数计算。
示例: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;
        }
    }
}

总结

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

目录
相关文章
Vue3炫酷可旋转的3D地球
Vue3炫酷可旋转的3D地球
1115 0
|
JavaScript 前端开发 索引
用Three.js搞个炫酷3D地球
地球人怎么可以不会画地球!从canvas画地球贴图开始,用Three.js手把手教你实现一个炫酷的3D地球!
用Three.js搞个炫酷3D地球
|
存储 中间件 开发工具
云计算的三个主要服务模型:IaaS、PaaS 和 SaaS
云计算的三个主要服务模型:IaaS、PaaS 和 SaaS
23360 0
|
XML 前端开发 Java
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
这篇文章是SpringMVC框架的入门教程,详细指导了如何在IDEA中使用Maven和Tomcat创建SpringMVC工程,包括添加依赖、配置web.xml、编写控制器、创建配置文件、配置Tomcat服务器以及进行基本的测试,展示了一个简单的Hello SpringMVC示例。
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
|
存储 缓存 监控
一文读懂分布式架构知识体系(内含超全核心知识大图)
7月9日 19:00-21:30 阿里云开发者社区首场“Offer 5000”直播开启!15位团队技术大牛在线招人,更有《阿里云技术面试红宝书》助你拿下Offer!马上投递简历:https://developer.aliyun.com/special/offerday01
20740 0
|
IDE 开发工具 开发者
手把手教你安装PyCharm 2025:开发者的Python IDE配置全流程+避坑指南
本教程详细介绍了PyCharm 2025版本在Windows系统下的安装流程及配置方法,涵盖AI代码补全与智能调试工具链等新功能。内容包括系统要求、安装步骤、首次运行配置(如主题选择与插件安装)、创建首个Python项目,以及常见问题解决方法。此外,还提供了切换中文界面和延伸学习资源的指导,帮助用户快速上手并高效使用PyCharm进行开发。
6493 61
|
机器学习/深度学习 SQL 数据采集
基于tensorflow、CNN网络识别花卉的种类(图像识别)
基于tensorflow、CNN网络识别花卉的种类(图像识别)
598 2
|
存储 缓存 监控
分布式架构知识体系
本文力求从分布式基础理论,架构设计模式,工程应用,部署运维,业界方案这几大方面,介绍基于MSA(微服务架构)的分布式的知识体系大纲。
1326 13
|
数据可视化 Java Nacos
Sleuth+Zipkin 实现 SpringCloud 链路追踪
【8月更文挑战第9天】Sleuth+Zipkin 实现 SpringCloud 链路追踪
933 1
Sleuth+Zipkin 实现 SpringCloud 链路追踪
|
人工智能 API Python
干货教程|PyCharm如何接入DeepSeek实现AI编程
干货教程|PyCharm如何接入DeepSeek实现AI编程
3703 0