简单工厂模式

举报
牛哄哄的柯南 发表于 2022/06/28 13:43:14 2022/06/28
【摘要】 简单工厂模式

简单工厂模式

引入问题

用任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。

【普通代码】

image-20220622090118583

这样的程序虽然解决了问题,但是不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。

说明:图片来源于大话设计模式,仅供学习使用。

【工厂模式代码】

题目中提到使用面向对象,那么面向对象的三大特征分别是封装、继承和多态。

我们可以尝试把计算类封装下,并且将不同的运算分来写,做到解耦,并且运用工厂模式。

架构如下图:

image-20220622090900773

【Java】

运算类

package keafmd.accumulate.designmode.factorymode;

/**
 * Keafmd
 *
 * @ClassName: Operation
 * @Description: 运算父类
 * @author: 牛哄哄的柯南
 * @date: 2022-06-22 19:10
 */
public class Operation {
    private double numA;
    private double numB;

    public double getNumA() {
        return numA;
    }

    public void setNumA(double numA) {
        this.numA = numA;
    }

    public double getNumB() {
        return numB;
    }

    public void setNumB(double numB) {
        this.numB = numB;
    }

    public double getResult() throws Exception {
        double res = 0;
        return res;
    }
}

加法类

package keafmd.accumulate.designmode.factorymode;

/**
 * Keafmd
 *
 * @ClassName: OperationAdd
 * @Description: 加运算
 * @author: 牛哄哄的柯南
 * @date: 2022-06-22 19:13
 */
public class OperationAdd extends Operation{

    @Override
    public double getResult() {
        return getNumA() + getNumB();
    }
}

减法类

package keafmd.accumulate.designmode.factorymode;

/**
 * Keafmd
 *
 * @ClassName: OperationSub
 * @Description: 减运算
 * @author: 牛哄哄的柯南
 * @date: 2022-06-22 19:18
 */
public class OperationSub extends Operation{

    @Override
    public double getResult() {
        return getNumA() - getNumB();
    }
}

乘法类

package keafmd.accumulate.designmode.factorymode;

/**
 * Keafmd
 *
 * @ClassName: OperationMul
 * @Description: 乘运算
 * @author: 牛哄哄的柯南
 * @date: 2022-06-22 19:19
 */
public class OperationMul extends Operation{

    @Override
    public double getResult() {
        return getNumA() * getNumB();
    }
}

除法类

package keafmd.accumulate.designmode.factorymode;

/**
 * Keafmd
 *
 * @ClassName: OperationDiv
 * @Description: 除运算
 * @author: 牛哄哄的柯南
 * @date: 2022-06-22 19:20
 */
public class OperationDiv extends Operation{

    @Override
    public double getResult() throws ArithmeticException {
        if(getNumB()==0){
            throw new ArithmeticException("除数不能为0!");
        }
        return getNumA() / getNumB();
    }
}

简单工厂类

package keafmd.accumulate.designmode.factorymode;

/**
 * Keafmd
 *
 * @ClassName: OperationFactory
 * @Description: 计算工厂
 * @author: 牛哄哄的柯南
 * @date: 2022-06-22 19:23
 */
public class OperationFactory {
    public static Operation createOperation(String operate) throws Exception {
        Operation operation = null;
        switch (operate){
            case "+":
                operation = new OperationAdd();
                break;
            case "-":
                operation = new OperationSub();
                break;
            case "*":
                operation = new OperationMul();
                break;
            case "/":
                operation = new OperationDiv();
                break;
            default:
                throw new Exception("输入运算符不合法!");
        }
        return operation;
    }
}

客户端

package keafmd.accumulate.designmode.factorymode;

import java.util.Scanner;

/**
 * Keafmd
 *
 * @ClassName: ComputingClient
 * @Description: 计算客户端
 * @author: 牛哄哄的柯南
 * @date: 2022-06-22 19:29
 */
public class ComputingClient {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入两个数:");
        double a = sc.nextDouble();
        double b = sc.nextDouble();
        System.out.println("请输入运算符(+,-,*,/):");
        String s = sc.next();
        Operation operation = OperationFactory.createOperation(s);
        operation.setNumA(a);
        operation.setNumB(b);
        System.out.println("运算结果为:" + operation.getResult());

    }
}

效果

请输入两个数:
2
3
请输入运算符(+-*/):
*
运算结果为:6.0

Process finished with exit code 0
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。