Java23种设计模式之-----工厂模式在开发中的应用

本文通过一个简单的计算器实例,详细介绍了如何逐步从面向过程设计改进为工厂模式,包括简单工厂模式、工厂方法模式和抽象工厂模式。通过这种方式,实现了代码的开放封闭原则,提高了代码的可扩展性和可维护性。
摘要由CSDN通过智能技术生成

一、工厂模式在开发中的运用
面试题:写一个简单的计算器
代码实现:
(1)、创建MainClass

package com.renxin.factory;

import java.util.Scanner;

public class MainClass {
    public static void main(String[] args) {
        //第一步:接受控制台输入的参数
        System.out.println("-----计算器程序-----");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个数:");
        String strNum1 = scanner.nextLine();

        System.out.println("请输入运算符:");
        String oper = scanner.nextLine();

        System.out.println("请输入第二个数:");
        String strNum2 = scanner.nextLine();

        //第二步:进行运算
        double result = 0;
        if("+".equals(oper)) {
            result = Double.parseDouble(strNum1) + Double.parseDouble(strNum2);
        }else if("-".equals(oper)) {
            result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2);
        }else if("*".equals(oper)) {
            result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2);
        }else if("/".equals(oper)) {
            result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2);
        }

        //返回结果
        System.out.println(strNum1+oper+strNum2+"="+result);
    }
}

控制台输出结果为:

请输入第一个数:
10
请输入运算符:
/
请输入第二个数:
2
10/2=5.0

上面代码存在缺点:完全面向过程设计,缺少代码复用
改进以上代码:
(1)、创建抽象类Operation

package com.renxin.factory;

public abstract class Operation {

    private double num1;
    private double num2;

    public double getNum1() {
        return num1;
    }

    public void setNum1(double num1) {
        this.num1 = num1;
    }

    public double getNum2() {
        return num2;
    }

    public void setNum2(double num2) {
        this.num2 = num2;
    }

    // 抽象方法
    public abstract double getResult();
}

(2)、创建AddOperation并且继承Operation

package com.renxin.factory;

public class AddOperation extends Operation {

    public double getResult() { 
        double result = this.getNum1()+this.getNum2();
        return result;
    }

}

(3)、修改MainClass

package com.renxin.factory;

import java.util.Scanner;

public class MainClass {
    public static void main(String[] args) {
        //第一步:接受控制台输入的参数
        System.out.println("-----计算器程序-----");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个数:");
        String strNum1 = scanner.nextLine();

        System.out.println("请输入运算符:");
        String oper = scanner.nextLine();

        System.out.println("请输入第二个数:");
        String strNum2 = scanner.nextLine();

        //第二步:进行运算
        double result = 0;
        double num1 = Double.parseDouble(strNum1);
        double num2 = Double.parseDouble(strNum2);

        Operation operation = new AddOperation();
        operation.setNum1(num1);
        operation.setNum2(num2);


        if("+".equals(oper)) {
            result = operation.getResult();
        }else if("-".equals(oper)) {
            result = operation.getResult();
        }else if("*".equals(oper)) {
            result = operation.getResult();
        }else if("/".equals(oper)) {
            result = operation.getResult();
        }

        //返回结果
        System.out.println(strNum1+oper+strNum2+"="+result);
    }
}

控制台输出结果为:

-----计算器程序-----
请输入第一个数:
1
请输入运算符:
+
请输入第二个数:
1
1+1=2.0

改进后的代码就是一个简单工厂模式的实现,但是还不是很完善,如果我们不想new这个Operation operation = new AddOperation();的话我们还可以改进,将它交给工厂来处理!
(1)、创建OperationFactory工厂

package com.renxin.factory;

public class OperationFactory {
    public static Operation getOperation(String oper) {
        if("+".equals(oper)) {
            return new AddOperation();
        }else if("-".equals(oper)) {
            return new subOperation();
        }else if("*".equals(oper)) {
            return new mulOperation();
        }else if("/".equals(oper)) {
            return new divOperation();
        }
        return null;
    }
}

(2)、创建加法AddOperation类,并且继承Operation

package com.renxin.factory;

public class AddOperation extends Operation {

    public double getResult() { 
        double result = this.getNum1()+this.getNum2();
        return result;
    }

}

(3)、修改MainClass

package com.renxin.factory;

import java.util.Scanner;

public class MainClass {
    public static void main(String[] args) {
        //第一步:接受控制台输入的参数
        System.out.println("-----计算器程序-----");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个数:");
        String strNum1 = scanner.nextLine();

        System.out.println("请输入运算符:");
        String oper = scanner.nextLine();

        System.out.println("请输入第二个数:");
        String strNum2 = scanner.nextLine();

        //第二步:进行运算
        double result = 0;
        double num1 = Double.parseDouble(strNum1);
        double num2 = Double.parseDouble(strNum2);

        Operation operation = OperationFactory.getOperation(oper);
        operation.setNum1(num1);
        operation.setNum2(num2);
        result = operation.getResult();

        //返回结果
        System.out.println(strNum1+oper+strNum2+"="+result);
    }
}

控制台打印结果为:

请输入第一个数:
1
请输入运算符:
+
请输入第二个数:
3
1+3=4.0

以上修改后的代码就是工厂方法模式的一个实现!
到这里为止以上代码只符合了开放封闭原则的开放原则,因此以上代码还可以进行改进!
(1)、修改OperationFactory类

package com.renxin.factory;

public interface OperationFactory {
    /*public static Operation getOperation(String oper) {
        if("+".equals(oper)) {
            return new AddOperation();
        }else if("-".equals(oper)) {
            return new subOperation();
        }else if("*".equals(oper)) {
            return new mulOperation();
        }else if("/".equals(oper)) {
            return new divOperation();
        }
        return null;
    }*/
    public  Operation getOperation();
}

(2)、创建实现类AddOperationFactory

package com.renxin.factory;

public class AddOperationFactory implements OperationFactory {

    public Operation getOperation() {

        return new AddOperation();
    }

}

(3)、修改MainClass

package com.renxin.factory;

import java.util.Scanner;

public class MainClass {
    public static void main(String[] args) {
        //第一步:接受控制台输入的参数
        System.out.println("-----计算器程序-----");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个数:");
        String strNum1 = scanner.nextLine();

        System.out.println("请输入运算符:");
        String oper = scanner.nextLine();

        System.out.println("请输入第二个数:");
        String strNum2 = scanner.nextLine();

        //第二步:进行运算
        double result = 0;
        double num1 = Double.parseDouble(strNum1);
        double num2 = Double.parseDouble(strNum2);

        /*Operation operation = OperationFactory.getOperation(oper);
        operation.setNum1(num1);
        operation.setNum2(num2);
        result = operation.getResult();*/

        if("+".equals(oper)) {
            OperationFactory factory = new AddOperationFactory();
            Operation operation = factory.getOperation();
            operation.setNum1(num1);
            operation.setNum2(num2);
            result = operation.getResult();
        }

        //返回结果
        System.out.println(strNum1+oper+strNum2+"="+result);
    }
}

控制台输出结果为:

请输入第一个数:
1
请输入运算符:
+
请输入第二个数:
1
1+1=2.0

以上修改后的代码就是抽象工厂模式的一个实现!
这样写的好处就是我们要新增其他运算的时候我们不需要修改工厂了,我们只需要添加一个相应的运算类和相应的工厂,这样也有一个缺点MainClass在调用的时候,你必须知道调用的那个工厂,所有在客户端里面就有做相应的判断!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值