java 反射模式

反射模式优化工厂类大量switch分支问题

继续上一篇工厂模式的案例,上一篇只有两个算法类(加法和减法),现在再加一个乘法

第一步:

//运算类
public class Operation {
    
    private double _numberA=0;
    private double _numberB=0;
    public double get_numberA() {
        return _numberA;
    }
    public void set_numberA(double _numberA) {
        this._numberA = _numberA;
    }
    public double get_numberB() {
        return _numberB;
    }
    public void set_numberB(double _numberB) {
        this._numberB = _numberB;
    }
    
    /**
     *得到运算结果 
     * @author ys-developer 
     * @return 
     * @since JDK 1.6
     */
    public double getResult(){
        double result=0;
        return result;
    }

}

第二步:

//加法类
public class OperationAdd extends Operation{
     @Override
     public  double getResult(){
         double result=0;
         result=get_numberA()+get_numberB();
         return result;
     }
}
//减法类
public class OperationSub extends Operation {

    @Override
    public double getResult(){
        double result=0.0;
        result=get_numberA()-get_numberB();
        return result;
    }
}
//乘法类
public class OperationRide extends Operation {

    @Override
    public double getResult(){
        double result=0.0;
        result=get_numberA()*get_numberB();
        return result;
    }
}

第三步:

创建一个properties配置文件,将“加减乘”类变成简单配置

JIA=OperationAdd
JIAN=OperationSub
CHENG=OperationRide

第四步:

修改工厂类  

//反射工厂
public class ReflexFactor {

    public static Operaction choose(String shortName){
        Operation operation=null;
        //从properties文件中读取shortName对应的完整包名
        Properties pro=new Properties();
        try {
            pro.load(new FileInputStream("src/Calculator.properties"));
            String fullName=pro.getProperty(shortName);
            
            //相当于代替工厂模式,直接将需要new的类写进去即可
            operation=(Operation) Class.forName(fullName).newInstance();//注意:如果找不到对应类,那么就得加上前面的路径  Class.forName("src."+fullName).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return operation;
    }
}

最后测试:

public class Test {

    public static void main(String[] args) {
        Operation oper=new Operation();
        Scanner scan = new Scanner(System.in);
        boolean isok=true;
        while (isok) {
            System.out.println("请输入数字A:");
            double a=scan.nextInt();
            System.out.println("请输入运算符号(+、-、*、/):");
            String b=scan.next();
            System.out.println("请输入数字B");
            double c=scan.nextInt();
            
            oper=ReflexFactor.choose(b);
            oper.set_numberA(a);
            oper.set_numberB(c);
            System.out.println("结果等于:"+oper.getResult());
            System.out.println("是否继续(y/n)");
            String d=scan.next();
            if (d.equals("n")) {
                break;
            }
        }
        
        
    }
}

总结:修改后的工厂类,大大的减少了switch 判断,以后在加一个除法,只需要创建要给除法类,在配置文件加一个配置即可,不需要再修改工程类

原文地址:https://www.cnblogs.com/fxd980519/p/9372320.html