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

2023-11-04

案例

在面试时,面试官让你通过面对对象语言,用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 {
    @Override
    public double getResult() {
        return getNumberA() + getNumberB();
    }
}

减法

public class Sub extends Operation {
    @Override
    public 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);
}

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

总结

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试之设计模式(简单工厂模式) 的相关文章

  • rnn pytorch_pytorch介绍rnn字符级文本生成

    rnn pytorch Today we ll continue our journey through the fascinating world of natural language processing NLP by introdu
  • MySQL可见_MySQL 8.0新特性 -- 不可见索引

    MySQL支持不可见索引 即优化器不会使用该索引 不可见索引特性不可以用于主键 默认索引是可见的 可以在create table create index alter table操作中使用关键字visible invisible来指定索引是
  • Python之整型

    1 python中一切都是对象 因此python中其实根本不存在int float这些类型 2 int其实是一个python对象 3 整数类型 int 在python中实际是上长整型 理论是可以存储无限大小的整型数 正数负数和0 一 int

随机推荐

  • linux杀死进程的五种方法

    方法一 Terminal终端输入 gnome system monitor 就可以打开system monitor 如图 然后找到相应进程 右击选择kill process就可以了 方法二 通过kill 进程id的方式可以实现 首先需要知道
  • 目标跟踪序列化测试以及搜参

    1 序列化测试 对于一些跟踪算法 特别是siamese系列 一般进行20epochs的训练 对应20个训练模型 特别是backbone解冻的后10个模型 均有可能出现最好的结果 got 10k与lasot的结果一般容易出现在10 15 ot
  • 第三章:primitive主数据类型和引用-认识变量

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第三章 primitive主数据类型和引用 认识变量 认识变量 变量有两种 primitive 简单的 主数据类型和引用 目前我们已经使用过变量的地方 对象的状态 i
  • 没有用到React,为什么我需要import引入React?

    没有用到React 为什么我需要import引入React 本质上来说JSX是React createElement component props children 方法的语法糖 所以我们如果使用了JSX 我们其实就是在使用React 所
  • 【华为OD机试真题 python】快递运输

    题目描述 运送的快递放在大小不等的长方体快递盒中 为了能够装载更多的快递同时不能让货车超载 需要计算最多能装多少个快递 注 快递的体积不受限制 快递数最多1000个 货车载重最大50000 输入描述 第一行输入每个快递的重量 用英文逗号隔开
  • 小爱控制HA上的开关(红外线)

    小爱同学控制homeassistant in 树莓派 by 红外线 前言 租了房子以后一直想搞智能家居自动化各种事情 最近终于腾出空可以搞辣 研究了一圈感觉拆开关太麻烦了 零火线还要撬开关 租的房子不敢瞎搞 想了一下可以用arduino 树
  • VMware Workstation 入门使用

    文章目录 名词解释 事先准备 安装 VMware Tools 将鼠标焦点从虚拟机中退出 共享剪切板 共享文件 夹 虚拟机为 Windows 虚拟机为 Linux 虚拟机快照的创建与加载 创建虚拟机快照 加载虚拟机快照 克隆虚拟机 构建宿主机
  • 【ztree应用】基于jquery实现带检索功能的ztree文件夹折叠效果(附源码下载)

    文章目录 写在前面 涉及知识 效果展示 1 搭建dom 2 引入ztree和jquery 3 实现搜索功能及调用 4 源码分享 1 百度网盘 2 123云盘 3 邮箱留言 总结 写在前面 前些日子 领导要求做一个关于数据库管理的工具 主要想
  • 循环点击链接selenium模拟

    https blog csdn net qq 43251443 article details 82819887转载
  • 私有地址和保留地址

    A类 10 X X X是私有地址 私有地址就是在互联网上不使用 而被用在局域网络中的地址 127 X X X是保留地址 用做循环测试用的 B类 172 16 0 0 172 31 255 255是私有地址 169 254 X X是保留地址
  • 深度学习进阶线路图

    研究动态 深度学习进阶线路图 一 在应用机器学习的时候 最耗时和重要的阶段是对原始数据进行特征提取 深度学习是一个新的机器学习的分支 他要做的就是跨过整个特征设计阶段 而是直接从数据中学习得到 大部分的深度学习方法都是基于神经网络的 在这些
  • Git命令大全

    Git命令大全 一 git config 二 git clone 三 git init 四 git status 五 git remote 六 git branch 七 git checkout 八 git add 九 git commit
  • 区块链技术对金融行业有什么冲击?

    区块链技术在经过了长达十年的发展 被越来越多的行业关注 特别是一些大型企业 对区块链技术还进行了深入的研究 区块链技术也在更多的领域被应用 区块链技术的热度虽然很高 但目前的发展还处在初级阶段 其过多的应用场景也是没有得到更大的发展 区块链
  • 蓝桥杯练习系统入门水题

    好几天没写代码了 上蓝桥杯的练习系统看了一下 做了四道巨水题之后发现有些题还要vip 无语 问题描述 Fibonacci数列的递推公式为 Fn Fn 1 Fn 2 其中F1 F2 1 当n比较大时 F
  • (计算机组成原理)指令的寻址方式

    指令寻址方式是指指令或者操作数有效地址的寻找方式 主要分为数据寻址和指令寻址 指令的地址码字段往往并不是操作数的真实地址 而是形式地址 用A表示 A 即操作数形式地址所指向的存储介质的数值 用形式地址结合指令的寻址方式可以计算出操作数的真实
  • 快速调整毕业论文格式:调整参考文献的引用样式和段落格式

    在撰写毕业论文的过程 我们需要参考并引用大量的参考文献 之前有介绍了如何在Word中使用Endnote插入参考文献 但是从Endnote样式网站下载的样式可能和学校要求的参考文献的引用格式和段落样式有些出入 我们需要根据需求在下载样式上进行
  • 二叉树 Binary Tree

    二叉树 二叉树的基本概念 1 什么是二叉树 2 二叉树的优点和缺点 3 二叉树的基本名词 4 二叉树的性质 5 特别的二叉树 满二叉树 Full Binary Tree 完全二叉树 Complete Binary Tree 平衡二叉树 Ba
  • 【C++】多态

    文章目录 1 多态的基本概念 2 动态联编和静态联编 2 多态的原理剖析 3 计算器案例 4 抽象类与纯虚函数 5 虚析构和纯虚析构函数 6 向上类型转换和向下类型转换 1 多态的基本概念 多态性提法接口和具体实现之间的另一层隔离 多态改善
  • 计算机硬件结构简略介绍

    前言 计算机硬件结构简略介绍 一 计算机硬件 从软件开发者的角度来看 计算机硬件有三个部件最为关键 分别是中央处理器CPU 内存 I O控制芯片 二 早期 早期计算机 CPU的核心频率不高 和内存的频率一样 他们都是直接连接在同一个总线 b
  • 面试之设计模式(简单工厂模式)

    案例 在面试时 面试官让你通过面对对象语言 用Java实现计算器控制台程序 要求输入两个数和运算符号 得出结果 大家可能想到是如下 public static void main String args Scanner scanner ne