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

news2024/10/6 22:22:46

案例

在面试时,面试官让你通过面对对象语言,用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);
}

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

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文让你了解SpringCloud五大核心组件

🏆今日学习目标: 🍀SpringCloud五大核心组件 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区,欢迎你的加入: 林…

2021-08-29

服务器 主:172.17.0.2 master 备:172.17.0.3 slave1 lvs虚拟IP:172.17.0.100 #nginx下载地址 http://nginx.org/download/ 本地文件路径 1.dockerfile构建nginx FROM centos:7 ADD nginx-1.6.0.tar.gz /usr/local COPY nginx_install.sh /usr/local RUN sh …

毕业设计(1)-AFLGO的安装

AFLGO是一个模糊测试工具,在CSDN上的安装教程不多,自己在安装过程中也出现了很多教程之外的错误,最后反复安装了2天终于安装成功这里记录一下安装工程中的错误 使用的平台:Ubuntu18.04 配置: 内存:6G&…

StreamAPI

StreamAPI 最近开发用上了 Java8的StreamAPI,(咋现在才用?嗯哼,项目需要)自己也不怎么会,来总结一波吧! 别认为好抽象!!!干他就完事 一.StreamAPI介绍 就是用来处理集合的数据 其实到后面会发现和SQL的语句是差不多的~哈哈?你不信?往下面看 Stream:英文翻译叫做流 举个粟子…

华为OD机试 - 最多等和不相交连续子序列(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

老学长的浙大MPA现场复试经验分享

作为一名在浙大MPA项目已经毕业的考生来说,很荣幸受到杭州达立易考周老师的邀请,给大家分享下我的复试经验,因为听周老师说是这几年浙大MPA因疫情情况,已经连续几年都是线上个人复试了,而今年疫情社会面较为平稳的情况…

【LoRa模块】关键参数记录

记录lora以及lorawa关键射频参数 这里写目录标题1. LoRa LoRaWAN LPWAN 三者区分2. LoRaWAN网路架构的特点3.关键参数4.参数定义1. LoRa LoRaWAN LPWAN 三者区分 2. LoRaWAN网路架构的特点 终端点的通讯是双向的 (bi-directional)LoRaWAN 数据速率可以从 0.3 kbps 到 50 kbps扩…

7 个 JavaScript Web API 来构建你不知道的未来网站

随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。但据了解,在100 多个 API中,只有5%被开发人员积极使用。让我们来看看一些有用的Web API,它们可以帮助您将网站推向月球!🌕🚀1.…

spring5.x-IOC模块源码学习

上文:spring5.x介绍及搭配spring源码阅读环境IOC介绍spring的IOC和DI演示案例com.hong.model.Userpackage com.hong.model;import org.springframework.stereotype.Component;import java.io.Serializable;/** * ClassName User * Description 用户 * Author csh * …

【Java】Spring的创建和使用

Spring的创建和使用 Spring就是一个包含众多工具方法的IOC容器。既然是容器,那么就具备两个最主要的功能: 将对象存储到容器中从容器中将对象取出来 在Java语言当中对象也叫作Bean。 1. 创建Spring项目 创建一个普通maven项目添加Spring框架支持(spri…

Kotlin-面向对象

本片博客主要写创建对象,创建接口,创建抽象类,data关键字的作用 创建对象 如何声明一个对象,使用class关键字 格式为: class 对象名字(对象属性名:属性类型…){} 如果对象没有函数…

python自学之《21天学通Python》(12)——第15章 线程和进程

现代操作系统大多都是多任务的,可以同时执行多个程序。进程是应用程序正在执行的实体,当程序执行时,也就创建了一个主线程。进程在创建和执行时需要一定的资源,比如内存、文件、I/O设备等。大多现代操作系统中支持多线程和进程。线…

JAVA服务端实现页面截屏(附代码)

JAVA服务端实现页面截屏适配需求方案一、使用JxBrowser使用步骤:方案二、JavaFX WebView使用步骤:方案三、Headless Chrome使用步骤:综上方案对比记录我的一个失败方案参考适配需求 有正确完整的地址url;通过浏览器能打开该url对…

Redis缓存一致性问题(缓存更新策略)

Redis缓存的一致性1. 缓存1.1 缓存的作用:1.2 缓存的成本:2. 缓存模型3. 缓存一致性问题3.1 引入3.2 解决(1) 先更新数据库,再手动删除缓存(2) 使用事务保证原子性(3) 以Redis中的TTL为兜底3.3 案例:商铺信息查询和更新(1) 查询商…

5.12 BGP选路原则综合实验

配置BGP的选路原则 1. 实验目的 熟悉BGP的选路的应用场景掌握BGP的选路的配置方法2. 实验拓扑 实验拓扑如图5-11所示: 图5-11:配置BGP的选路原则 3. 实验步骤 (1)配置IP地址 R1的配置

Spring中自定义Session管理,Spring Session源码解析

系列文章:Spring Boot学习大纲,可以留言自己想了解的技术点 目录 系列文章:Spring Boot学习大纲,可以留言自己想了解的技术点 1、session是什么? 1>session在哪里? 2>服务器怎么知道每次说话的是…

Python + Selenium,分分钟搭建 Web 自动化测试框架!

在程序员的世界中,一切重复性的工作,都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短,迭代速度越来越快,只会点点点,不懂开发的手工测试,已经无法满足如今的…

【Datawhale图机器学习】DeepWalk和Node2Vec

DeepWalk:用于图节点嵌入的在线机器学习算法 论文介绍 DeepWalk是基于随机游走的图节点嵌入算法。首次将深度学习和自然语言处理思想用于图机器学习,将随机游走序列与句子类比,节点与单词类比,构建Word2Vec的Skip-Gram无监督&am…

了解Axios及其运用方式

Axios简介 axios框架全称(ajax – I/O – system): 基于promise用于浏览器和node.js的http客户端,因此可以使用Promise API 一、axios是干啥的 说到axios我们就不得不说下Ajax。在旧浏览器页面在向服务器请求数据时,…

计算机网络基础知识

目录 通信基础 前言 广播域与冲突域 计算机之间的连接方式 网线直连(交叉线) 同轴电缆 集线器 网桥 前言 举例(计算机6向计算机7相互通信) 交换机 交换机原理 路由器 路由器与其他设备区别: 注意&#…