设计模式之工厂方法模式

本文通过对比简单工厂模式,详细介绍了如何使用工厂方法模式实现加减乘除计算器。定义了一个工厂接口和对应的具体工厂类,以及运算符类和具体运算实现。在业务逻辑中,根据用户输入动态创建运算对象,展示了工厂方法模式的灵活性和优势,克服了简单工厂模式的封闭性问题。
摘要由CSDN通过智能技术生成

通过改造简单工厂模式计算器来简单梳理工厂方法模式

我们可以实现工厂方法模式,与前文简单工厂模式代码做个对比

工厂方法模式实现加减乘除计算器

定义相关类

首先定义一个工厂接口

//代理接口
public interface IFactory {
    Operation CreateOperation();
}

分别定义加减乘除工厂类

public class AddFactory implements IFactory{
    @Override
    public Operation CreateOperation() {
        return new OperationAdd();
    }
}
public class SubFactory implements IFactory {
    @Override
    public Operation CreateOperation() {
        return new OperationSub();
    }
}
public class MulFactory implements IFactory {
    @Override
    public Operation CreateOperation() {
        return new OperationMul();
    }
}
public class DivFactory implements IFactory {
    @Override
    public Operation CreateOperation() {
        return new OperationDiv();
    }
}

运算符类及运算符具体类,同简单工厂模式中保持一致即可

public class Operation {
    private double numA = 0;
    private double numB = 0;

    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 result = 0;
        return result;
    }
}

加法运算具体实现类

public class OperationAdd extends Operation{
    @Override
    public double getResult() {
        double result = 0;
        result = getNumA()+getNumB();
        return result;
    }
}

减法乘法除法同简单工厂模式一致,忽略。

定义业务方法

看在具体业务逻辑中如何使用

public class FactoryMethodTest {
    public static void main(String[] args) {
        //工厂方法模式
        func1();
    }

    public static void func1(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数字A:");
        String strA = scanner.nextLine();
        System.out.println("请输入运算符(+、-、*、/):");
        String strOper = scanner.nextLine();
        System.out.println("请输入数字B:");
        String strB = scanner.nextLine();

        String strResult = "";
        try{
           IFactory operFactory = null;
           switch (strOper){
               case "+":
                   operFactory = new AddFactory();
                   break;
               case "-":
                   operFactory = new SubFactory();
                   break;
               case "*":
                   operFactory = new MulFactory();
                   break;
               case "/":
                   operFactory = new DivFactory();
                   break;
           }
           Operation oper = operFactory.CreateOperation();
           oper.setNumA(Double.valueOf(strA));
           oper.setNumB(Double.valueOf(strB));
           strResult = oper.getResult()+"";
           System.out.println("运算结果是:"+strResult);
        }catch (Exception e){
            System.out.println("运算出错,异常信息:"+e.getMessage());
        }
    }
}

执行结果

请输入数字A:
15
请输入运算符(+、-、*、/):
/
请输入数字B:
3
运算结果是:5.0

结果分析

工厂方法模式,定义一个用于创建对象的接口,让子类去决定实例化哪一个类。工厂方法模式,让一个类的实例化延迟到其子类上。    

工厂方法模式克服了简单工厂模式违背开放封闭原则的缺点,又保持了封装对象创建的有点。

工厂方法模式是简单工厂模式的进一步抽象和推广。

https://xmlrambo.github.io/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值