使用简单工厂模式写一个简单的计算器!!!
很经典又基本的一个面试题了,新手基本都会掉进去的坑,还是没有自己的变成思想,哈哈.....
其实主要就是考虑一下使用面向对象和接口,以及计算器的可扩展性,话不多说:
接口:
1 2 3 4 5 6 | //运算类接口 public interface Operator { //获取结果 public double getResult( double num1, double num2); } |
运算的实现类:
1 2 3 4 5 6 7 8 | //加法运算 public class AddOperator implements Operator { @Override public double getResult( double num1, double num2) { return num1+num2; } } |
1 2 3 4 5 6 7 8 9 10 11 12 | //除法 public class DivOperator implements Operator { @Override public double getResult( double num1, double num2) { if (num2!=0){ return num1*num2; } else { System. out .println( "除数不能为0" ); return 0; } } } |
其他运算类似
运算工厂:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //创建运算类工厂 public class OperatorFactory { //返回运算类对象 public static Operator getOperator(String oper){ if (oper. equals ( "+" )){ return new AddOperator(); } else if (oper. equals ( "-" )){ return new SubOperator(); } else if (oper. equals ( "*" )){ return new MulOperator(); } else if (oper. equals ( "/" )){ return new DivOperator(); } else { System. out .println( "目前不支持这种操作" ); return null ; } } } |
主函数测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | //使用工厂模式开发一个简单计算器 public class CaclTest { public static void main(String[] args) { System. out .println( "请输入第一个数字:" ); Scanner scanner= new Scanner(System. in ); String num1 = scanner.nextLine(); System. out .println( "请输入运算符(+-*/):" ); String oper = scanner.nextLine(); System. out .println( "请输入第二个数字:" ); String num2 = scanner.nextLine(); //通过工厂获取运算类 Operator operator = OperatorFactory.getOperator(oper); if ( operator != null ){ if (isDouble(num1) && isDouble(num2)){ double result = operator .getResult(Double.parseDouble(num1), Double.parseDouble(num2)); System. out .println( "结果是:" +result); } else { System. out .println( "请输入正确的数字!" ); } } } //判断浮点数(double和float) private static boolean isDouble(String str) { if ( null == str || "" . equals (str)) { return false ; } Pattern pattern = Pattern.compile( "^[0-9]+(.[0-9]+)?$" ); //数字,包括整数和浮点 return pattern.matcher(str).matches(); } } |
主要考虑一下可能遇到的异常就行了,这里如果以后要增加运算的话,需要改一下工厂类,并添加一个具体运算实现类,想想也挺麻烦的,哈哈
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异