简单工厂模式

Posted 牛哄哄的柯南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单工厂模式相关的知识,希望对你有一定的参考价值。

简单工厂模式

引入问题

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

【普通代码】

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

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

【工厂模式代码】

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

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

架构如下图:

【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

以上就是简单工厂模式的全部内容

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]


加油!

共同努力!

Keafmd

以上是关于简单工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

简单工厂模式+工厂方法模式+抽象工厂模式

工厂模式,简单工厂模式,抽象工厂模式三者有啥区别

设计模式从青铜到王者第五篇:创建型模式之简单工厂模式( Simple Factory Pattern )

02 简单工厂模式

iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

JAVA设计模式——工厂模式简单工厂模式工厂方法模式抽象工厂模式