面试之设计模式(简单工厂模式)

news/2024/3/28 17:57:28/文章来源:https://blog.csdn.net/RoyRaoHR/article/details/129157560

案例

在面试时,面试官让你通过面对对象语言,用Java实现计算器控制台程序,要求输入两个数和运算符号,得出结果。大家可能想到是如下:

public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入任意数1");double numberA = scanner.nextDouble();System.out.println("请输入任意数2");double numberB = scanner.nextDouble();System.out.println("请选择运算符(+、-、*、/)");String operation = scanner.next();double result = 0L;switch (operation) {case "+" :result = numberA + numberB;break;case "-" :result = numberA - numberB;break;case "*" :result = numberA * numberB;break;case "/" :result = numberA / numberB;break;default:break;}System.out.println("结果:" + result);scanner.close();}

上面的代码确实能够满足面试所需求的,但是你觉得就真的这么简单吗。
写出上列代码只能说明你有一定的代码基础能力,如果是刚毕业能写出来还算OK,但是如果你已经工作一年以上还写出这种代码,只能说平常确实没有进行过学习。

通过这道题目可以考验你对Java的封装、继承、多态、设计模式的理解。

封装

分离业务逻辑和界面逻辑,降低耦合度,实现易维护、易扩展
Operation运算类

public class Operation {public static double GetResult(double numberA, double numberB, String operation) {double result = 0L;switch (operation) {case "+" :result = numberA + numberB;break;case "-" :result = numberA - numberB;break;case "*" :result = numberA * numberB;break;case "/" :result = numberA / numberB;break;default:break;}return result;}}

客户端代码

@SpringBootTest
class ProgramTest {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入任意数1");double numberA = scanner.nextDouble();System.out.println("请输入任意数2");double numberB = scanner.nextDouble();System.out.println("请选择运算符(+、-、*、/)");String operation = scanner.next();double result = Operation.GetResult(numberA, numberB, operation);System.out.println("结果:" + result);scanner.close();}
}

这样就将业务与页面分离开,后面其他程序需要用到计算业务,直接复用Operation就可。
但是依旧达不到灵活的可修改和可扩展,比如现在需要增加一个开根运算,那只能改Operation,在switch中增加一个分支,在复杂业务中,改动原有逻辑有可能会出现问题。
要想实现灵活的可修改和可扩展,就需要使用到继承和多态

继承、多态

Operation 计算器的父类

public abstract class Operation {private double numberA;private double numberB;public abstract double getResult();public double getNumberA() {return numberA;}public void setNumberA(double numberA) {this.numberA = numberA;}public double getNumberB() {return numberB;}public void setNumberB(double numberB) {this.numberB = numberB;}
}

加法

public class Add extends Operation {@Overridepublic double getResult() {return getNumberA() + getNumberB();}
}

减法

public class Sub extends Operation {@Overridepublic double getResult() {return getNumberA() - getNumberB();}
}

加减乘除写成运算类的子类,继承运算类后,重写GetResult()方法,这样修改任何一个算法,都不需要提供其他算法的代码了,但问题来了,如何让计算器知道我是希望使用哪一种算法呢?

简单工厂模式

简单运算工厂类

public class OptionerFactory {public static Operation createOperation(String operation) {Operation oper = null;switch (operation) {case "+":oper = new Add();break;case "-":oper = new Sub();break;}return oper;}
}

只需要输入运算符号,工厂就实例化出合适的对象,通过多态,返回父类的方式实现了计算器的结果

客户端代码

public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入任意数1");double numberA = scanner.nextDouble();System.out.println("请输入任意数2");double numberB = scanner.nextDouble();System.out.println("请选择运算符(+、-、*、/)");String oper = scanner.next();Operation operation = OptionerFactory.createOperation(oper);operation.setNumberA(numberA);operation.setNumberB(numberB);double result = operation.getResult();System.out.println("结果:"+result);
}

测试结果
在这里插入图片描述

总结

题目很简单,就像在学校解数学题一样,解法有很多种,但是大部分人只会最简单的一种,你能写出多种解法,说明你对这方面有深入学习过。而面试官要考验的就是这个。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72685.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BERT模型系列大全解读

前言 本文讲解的BERT系列模型主要是自编码语言模型-AE LM(AutoEncoder Language Model):通过在输入X中随机掩码(mask)一部分单词,然后预训练的主要任务之一就是根据上下文单词来预测这些单词,从…

F.pad() 函数

F.pad() 对tensor 进行扩充的函数。 torch.nn.functional.pad (input, pad, mode‘constant’, value0) input:需要扩充的 tensor,可以是图像数据,亦或是特征矩阵数据;pad:扩充维度,预先定义某维度上的扩充…

到了35岁,软件测试职业发展之困惑如何解?

35岁,从工作时间看,工作超过10年,过了7年之痒,多数IT人都已经跳槽几次。 35岁,发展比较好的软件测试人,已经在管理岗位(测试经理甚至测试总监)或已经成为测试专家或测试架构师。发展…

Head First设计模式---4.工厂方法模式

2.1工厂方法模式 亦称: 虚拟构造函数、Virtual Constructor、Factory Method 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。 [外链图片转存失败,源站可能有防盗链机制,建议将图片…

掌握MySQL分库分表(七)广播表、绑定表实战,水平分库+分表实现及之后的查询和删除操作

文章目录什么是广播表广播表实战数据库配置表Java配置实体类配置文件测试广播表水平分库分表配置文件运行测试什么是绑定表?绑定表实战配置数据库配置Java实体类配置文件运行测试水平分库分表后的查询和删除操作查询操作什么是广播表 指所有的分片数据源中都存在的…

2023该好好赚钱了,推荐三个下班就能做的副业

在过去的两年里,越来越多的同事选择辞职创业。许多人通过互联网红利赚到了他们的第一桶金。随着短视频的兴起,越来越多的人吹嘘自己年收入百万,导致很多刚进入职场的年轻人逐渐迷失自我,认为钱特别容易赚。但事实上,80…

Docker启动RabbitMQ,实现生产者与消费者

目录 一、Docker拉取镜像并启动RabbitMQ 二、Hello World (一)依赖导入 (二)消息生产者 (三)消息消费者 三、实现轮训分发消息 (一)抽取工具类 (二)启…

零基础机器学习做游戏辅助第十四课--原神自动钓鱼(四)yolov5目标检测

一、yolo介绍 目标检测有两种实现,一种是one-stage,另一种是two-stage,它们的区别如名称所体现的,two-stage有一个region proposal过程,可以理解为网络会先生成目标候选区域,然后把所有的区域放进分类器分类,而one-stage会先把图片分割成一个个的image patch,然后每个im…

【微信小程序】--JSON 配置文件作用(三)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#…

二叉树、二叉搜索树、二叉树的最近祖先、二叉树的层序遍历【零神基础精讲】

来源0x3f:https://space.bilibili.com/206214 文章目录二叉树[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)[111. 二叉树的最小深度](https://leetcode.cn/problems/minimum-depth-of-binary-tree/)[129. 求根节点到叶节点…

黑马 Vue 快速入门 笔记

黑马 Vue 快速入门 笔记0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 七大属性0.5 el:挂载点1 VUE基础1.0 第一个vue代码:Hello,vue1.1 v-bind 设置元素的属性 简写 :1.2 v-if , v-else , v-else-ifv-if , v-e…

XC7K70T-1FBG676C应用XC7K70T-L2FBG484E Kintex-7, FPGA 规格参数

概述Kintex-7 FPGA为快速增长应用和无线通信提供最优性价比和低功耗。Kintex-7 FPGA允许设计人员构建卓越带宽和12位数字可编程模拟,同时满足成本和功耗要求。144GMACS数字信号处理器 (DSP) 的独特功耗使得多功能Kintex-7器件成为便携式超声波设备和下一代通信等应用…

文案女王彭芳如何转变为“百万发售系统”创始人?我们来探个究竟!

智多星老师 她的输出跟智多星老师几乎毫无二致,是抄袭还是纯属巧合呢? 你们问的这个问题我也想知道,为了了解真相,我让我的一个学生把那个叫“彭芳老师”的视频给我看,当看到她的简介时,我非常震惊&#…

Elasticsearch在Linux中的单节点部署和集群部署

目录一、Elasticsearch简介二、Linux单节点部署1、软件下载解压2、创建用户3、修改配置文件4、切换到刚刚创建的用户启动软件5、测试三、Linux集群配置1、拷贝文件2、修改配置文件3、分别修改文件所有者4、启动三个软件5、测试四、问题总结1、在elasticsearch启动时如果报错内存…

numpy的常见数据类型

常见数据类型介绍Python 原生的数据类型相对较少, bool、int、float、str等。这在不需要关心数据在计算机中表示的所有方式的应用中是方便的。然而,对于科学计算,通常需要更多的控制。为了加以区分 numpy 在这些类型名称末尾都加了“_”。类型…

ES mapping 详解

nested 类型??? _all _routing; ES-mapping Elasticsearch根据业务创建映射mapping结构分析:keyword和text(一)_elasticsearch keyword mapping_周全全的博客-CSDN博客 0.Mapping样例 {"mapping…

【MySQL进阶】 锁

😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…

[手把手教你]实现简单的登录跳转以及tab栏的动态渲染

需求:实现login登录页输入用户名和密码, 匹配失败显示提示信息, 成功则跳转到index主页index页面中各组件通过嵌套路由实现,点击一级菜单可以动态显示二级菜单1.使用vite搭建项目安装初始化npm init vuelatest选择配置进入项目目录,安装模块npm i, 启动项目npm run dev2.项目目…

S5P6818_系统篇(2)源码编译及烧录

源码获取 源码获取和操作流程 1.下载liunux下的系统制作脚本,可以烧录系统和构建镜像 git clone https://github.com/friendlyarm/sd-fuse_s5p6818.git 如果出现git错误可使用如下方法: git config --global http.sslverify false 2.阅读该工具rea…

软件测试5年,一路走来的艰辛路程

前言 不论你是什么时候开始接触测试这个行业的,你首先听说的应该是功能测试。通过一些测试手段来验证开发做出的代码是否符合产品的需求?当然你也有自己对功能测试的理解,但是最近两年感觉功能测试好像不太受欢迎,同时不少同学真的…