当前位置: 首页 > news >正文

简单工厂设计模式(计算器实例优化)

简单工厂设计模式(计算器实例优化)

  • 介绍
  • 为什么采用面向对象编程而不是面向过程呢?
  • 实例讲解
    • 业务层划分出来
    • 逻辑层
    • 继承
    • 简单工厂:(多态)
    • 业务层:(解耦合)
    • 主控制台
  • 总结

介绍

本文内容引用自《大话这设计模式》这本书第一章节简单工厂设计模式,供自己提高代码水平使用。
案例也同样采用计算器功能实现方式展开
实现功能---->封装---->继承---->多态---->面向对象

为什么采用面向对象编程而不是面向过程呢?

在当今互联网开发的大型企业中你会发现,当你接到一个功能模块的时候不会给你完整的项目源码,特别是核心的东西,为什么呢?

仔细想一下,如果公司把员工薪资分发系统让你修改,这时你动了一下坏心思,做了一层 If 判断,如果名字是自己的话薪资*2,是不是公司就赔了?况且公司也不会这么傻,把这种核心的功能让新手做修改,这就引入代码的面向对象,将代码分为逻辑层和业务层分开处理,这样不仅逻辑清晰方便后期的修改,也方便了公司为自身的保护。

实例讲解

我们创建一个主控制台,先用一个面向过程的编程方式去写一个计算器功能,代码如下

while (true){try{Console.WriteLine("请输入第一个数字一");double number1 = double.Parse(Console.ReadLine());Console.WriteLine("请输入运算符");string symbol = Console.ReadLine();Console.WriteLine("请输入第一个数字二");double number2 = double.Parse(Console.ReadLine());switch (symbol){case "+":Console.WriteLine(number1 + number2);break;case "-":Console.WriteLine(number1 - number2);break;case "*":Console.WriteLine(number1 * number2);break;case "/":if (number2 == 0d){Console.WriteLine("被除数不能为0");break;}Console.WriteLine(number1 / number2);break;default:break;}}catch (Exception ex){Console.WriteLine(ex);}}

这时候我们分析一下

  1. 首先逻辑是没有问题的,如果后期修改怎么办?是否需要将完整的代码拿出来修改?
  2. 如果我们后期需要增加一个开平方根,时候会影响了其他运算的逻辑?
  3. 如果我们现在需要开发另外一个平台的计算器功能,我们能都将这个代码拿过去直接复用?

先回答第一个问题,这个代码比较简单,修改起来也比较方便,但是如果项目需求比较大,我们可能会话费很长时间去找当时写的代码,这时候会非常话费时间,那么我们可以将逻辑层和业务层分开,代码如下

业务层划分出来

public class Operation{public static double GetResult(double number1,double number2,string symbol) {double result = 0;switch (symbol){case "+":result = number1 + number2;break;case "-":result = number1 - number2;break;case "*":result = number1 * number2;break;case "/":if (number2 == 0d){Console.WriteLine("被除数不能为0");break;}result = number1 / number2;break;default:break;}return result;}}

逻辑层

while (true){try{Console.WriteLine("请输入第一个数字一");double number1 = double.Parse(Console.ReadLine());Console.WriteLine("请输入运算符");string symbol = Console.ReadLine();Console.WriteLine("请输入第一个数字二");double number2 = double.Parse(Console.ReadLine());double result = Operation.GetResult(number1,number2,symbol);Console.WriteLine("结果为"+result);}catch (Exception ex){Console.WriteLine(ex);}}

这时候是否显得比较整洁,之后修改的时候我们直接使用Operation这个脚本修改即可

回答第二个问题

如果这时候我们需要增加一个需求,当我们做➕法运算的时候,我们得到的值始终是要多➕2的,这时候我们如果按照当前的方法修改的话,我们需要改动Operation这个类中的GetResult方法即可,但是这个方法里面包含了4个逻辑算式,如果这时候不小心动了其他的怎么办?所以这时候我们就要引入面向对象知识,封装,继承,多态的方式去修改当前代码。代码如下

public class Operation{private double m_number1;private double m_number2;public double Number1 { get { return m_number1; } set { m_number1 = value; } }public double Number2 { get { return m_number2; } set { m_number2 = value; } }public virtual double GetResult() {double result = 0;return result;}}public class Add : Operation {public override double GetResult(){double result = Number1 + Number2;return result;}}public class Subtract : Operation{public override double GetResult(){double result = Number1 - Number2;return result;}}public class Multiply : Operation{public override double GetResult(){double result = Number1 * Number2;return result;}}public class Divide : Operation{public override double GetResult(){if(Number2 == 0)throw new Exception("除数不能为0");double result = Number1 / Number2;return result;}}

继承

修改业务层层,增加两个属性,并且重写一个方法,在定义四个不同的运算符类,分别继承业务层Operation,根据不同的方式重写基类方法

这里回答第三个问题

如何复用我们当前写的东西呢?这里可能对于刚开始编程的人来说不会区分对象,这里我们将每一个运算式分别定义一个对象,然后这里的每一个对象分别有两个属性,数字一和数字二,这样理解就比较清晰,既然明白了对象,我们就将面向对象的多态简单工厂设计模式引入到里面,从而达到我们所写代码的复用性,代码如下:

简单工厂:(多态)

public static Operation CreateOperation(string symbol) {Operation oper = null;switch (symbol){case "+":oper = new Add();break;case "-":oper = new Subtract();break;case "*":oper = new Multiply();break;case "/":oper = new Divide();break;default:break;}return oper;}

业务层:(解耦合)

public class Operation{private double m_number1;private double m_number2;public double Number1 { get { return m_number1; } set { m_number1 = value; } }public double Number2 { get { return m_number2; } set { m_number2 = value; } }public virtual double GetResult() {double result = 0;return result;}}public class Add : Operation {public override double GetResult(){double result = Number1 + Number2;return result;}}public class Subtract : Operation{public override double GetResult(){double result = Number1 - Number2;return result;}}public class Multiply : Operation{public override double GetResult(){double result = Number1 * Number2;return result;}}public class Divide : Operation{public override double GetResult(){if(Number2 == 0)throw new Exception("除数不能为0");double result = Number1 / Number2;return result;}}

主控制台

class Program{static void Main(string[] args){while (true){try{Console.WriteLine("请输入第一个数字一");double number1 = double.Parse(Console.ReadLine());Console.WriteLine("请输入运算符");string symbol = Console.ReadLine();Console.WriteLine("请输入第一个数字二");double number2 = double.Parse(Console.ReadLine());Operation oper;oper = OperationFactory.CreateOperation(symbol);oper.Number1 = number1;oper.Number2 = number2;Console.WriteLine("结果为"+oper.GetResult());}catch (Exception ex){Console.WriteLine(ex);}}}}

总结

巧妙的使用面向对象的封装继承和多态会让我们后期的维护节约不少时间,提高了开发的效率,当我们将代码移植到别的平台的时候,我们只需要将业务层Operation 和 OperationFactory移植即可方便调用。

相关文章:

简单工厂设计模式(计算器实例优化)

简单工厂设计模式(计算器实例优化) 介绍为什么采用面向对象编程而不是面向过程呢?实例讲解业务层划分出来逻辑层继承简单工厂:(多态)业务层:(解耦合)主控制台 总结 介绍 …...

iconify图标集离线使用方案简介

1.需求描述 前端项目,技术栈使用Vue3Element Plus,参考了ruoyi-vue-pro项目与vue-element-plus-admin项目,封装了一个Icon组件,图标使用的是iconify,项目部署在内网环境,不能连接互联网,需要部署一套iconi…...

java基础之理解多态

目录 简单理解 满足多态的三个条件 有类继承或者接口实现 子类要重写父类的方法 父类的引用指向子类的对象。 代码示例 动态多态 静态多态 个人观点 简单理解 简单理解就是,同一操作作用于不同的对象,可以有不同的解释,产生不同的执…...

第二证券:A股市场放量反弹 跨年行情或启动

沪指日线等级放量反弹,周四收中阳线成功站上20日均线,底部结构或可树立。创业板指大涨近4%,日线MACD出现底违反,多方动能较强,中等级反弹行情或在酝酿。月线来看,12月创业板指探底上升出现较长下影&#xf…...

web漏洞与修复

一、web漏洞 检测到目标X-Content-Type-Options响应头缺失 详细描述X-Content-Type-Options HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改。这就禁用了客户端的 MIM…...

基于Java+SpringBoot+vue实现图书借阅管理系统

基于JavaSpringBootvue实现图书借阅和销售商城一体化系统 🍅 作者主页 程序设计 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 文章目录 基于JavaSpringBootvue实现图书借阅和销售商城一体化…...

xml文件学习(xml格式)可扩展标记语言(Extensible Markup Language)

XML 教程 文章目录 XML 文件学习1. XML 概述1.1 什么是 XML?1.2 XML 有什么作用? 2. XML 基本结构1. 声明2. 元素3. 属性4. 文本5. 注释 3. XML 高级知识3.1 XML 命名空间3.2 XML 架构3.3 XML 工具3.4 XML 技术 4. XML 应用实例 XML 文件学习 XML&#…...

nodejs+vue+ElementUi家政服务系统c90g5

项目中登录模块用到token家政服务平台有管理员,雇主,雇员三个角色。管理员功能有个人中心,雇主管理,雇员管理,资料认证管理,项目类型管理,服务项目管理,需求信息管理,服务…...

数据库(Database)基础知识

什么是数据库 数据库是按照数据结构来组织、存储和管理数据的仓库,用户可以通过数据库管理系统对存储的数据进行增删改查操作。 数据库实际上是一个文件集合,本质就是一个文件系统,以文件的方式,将数据保存在电脑上。 什么是数据…...

QT应用篇 二、QML用Image组件实现Progress Bar 的效果

QT应用篇 一、QT上位机串口编程 二、QML用Image组件实现Progress Bar 的效果 三、QML自定义显示SpinBox的加减按键图片及显示值效果 文章目录 QT应用篇前言一、qml需求二、使用组件1.Image组件2.Image中fillMode的使用例子 总结 前言 记录自己学习QML的一些小技巧方便日后查找…...

SElinux工作原理简介并演示chcon、semanage、restorecon的使用方法

目录 一.SElinux工作原理简介 1.system_u 2.object_r 3.httpd_sys_content_t 4.s0 二.SElinux策略的具体使用详情 1.restorecon 2.semanage 3.chcon 一.SElinux工作原理简介 通过mac方式管理进程,管理的目标是进程是否具有读取权限的文件(文件…...

表情串转换

前言 NWAFU 2021阶段二 D 一、题目描述 题目描述 在一个字符串中,设置了由‘/’前导字符和某些特定字母构成的转义子字符串,如“/s”、“/f”、“/c”等用于表示特殊表情符号。现要求编写一个函数,将给定字符串中的转义字符串转换为表情字…...

【娱乐小技巧】网页旋转90° 3步搞定

一、按F12,打开控制台; 二、点击号; 插入新body; 三、粘贴代码 -webkit-transform: rotate(90deg);小结,角度值可以自选; 代码的效果:...

移动管理系统软件哪家好?它是如何帮助企业降本增效的?

现在很多管理系统都可以用移动设备接入,最常见的就是手机。只要给管理系统创建一个微信小程序接口,那么要使用系统功能的时候直接打开微信小程序就可以了。例如我们小区的物业巡检就是通过微信扫码打开巡检工单记录信息的,直接用巡检保安自己…...

电脑表格文件丢失如何找回?3个方法拯救丢失的文件!

“太难了!我辛辛苦苦在电脑上做的表格,不知道什么原因突然就没有了,有什么方法可以找回丢失的表格文件吗?快帮帮我吧!” 在日常工作中,很多电脑用户可能都会用到表格文件,这往往记载了大量的重要…...

VSCode 如何安装插件的历史版本

背景 在日常开发过程中,我们可能会遇到新版VSCode插件存在问题,无法正常工作的情况。这种情况下,一种可行的解决方案就是安装插件的历史版本。VSCode 插件默认安装的都是插件最新的版本,例如下面 vscode-styled-compoents 插件 本…...

关于edge浏览器以及插件推荐

目录 广告拦截和隐私工具 密码管理器 生产力和组织工具 写作和语法工具 购物助手 娱乐和个性化 安全性和VPN 开发者工具 其他实用工具 Microsoft Edge 是一款基于Chromium开源项目的现代网络浏览器,由微软开发。它是Internet Explorer的继任者,…...

Vue Tinymce富文本组件自定义操作按钮

想实现如下效果 首先在init方法中的增加一插件 增加一个setup方法 代码 setup: function(editor) { editor.ui.registry.addButton(testButton, {text: 日记日期,tooltip: 插入日记日期,onAction: () > editor.insertContent("123456")});}, 操作效果&#xff0…...

论文阅读:Blind Super-Resolution Kernel Estimation using an Internal-GAN

这是发表在 2019 年 NIPS 上的一篇文章,那个时候还叫 NIPS,现在已经改名为 NeurIPS 了。文章中的其中一个作者 Michal Irani 是以色 Weizmann Institute of Science (魏茨曼科学研究学院) 的一名教授,对图像纹理的内在统计规律有着很深入的研…...

韩国Neowine车规认证加密芯片ALPU-CV

由工采网代理的ALPU-CV是韩国Neowine(纽文微)推出的一款高性能车规级加密芯片;也是ALPU系列中的高端IC,该芯片通过《AEC-Q100》认证,目前已经在国产前装车辆配件量产使用,主要用于版权license保护、设备防伪…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...