使用简单工厂模式写一个简单的计算器!!!

很经典又基本的一个面试题了,新手基本都会掉进去的坑,还是没有自己的变成思想,哈哈.....

其实主要就是考虑一下使用面向对象和接口,以及计算器的可扩展性,话不多说:

接口:

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();
    }
}

  主要考虑一下可能遇到的异常就行了,这里如果以后要增加运算的话,需要改一下工厂类,并添加一个具体运算实现类,想想也挺麻烦的,哈哈

 

posted @   侯小厨  阅读(2830)  评论(5编辑  收藏  举报
编辑推荐:
· 从 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的设计差异
Fork me on Gitee
点击右上角即可分享
微信分享提示