小案例带你区别和理解java的工厂模式和反射机制

工厂模式

举个例子

I18N接口

package com.imooc.factory.i18n;

//Internationalization

public interface I18N {

public String getTitle();

}

 

工厂  I18NFactory.java

public class I18NFactory {

 

public static I18N getI18NObject(String area) {

if(area.equals("china")) {

return new Chinese();

}else if(area.equals("spain")) {

return new Spainish();

}else if(area.equals("italy")) {

return new Italian();

}else {

return null;

}

}

}

 

 

 

public class Italian  implements I18N{

public String getTitle() {

return "意大利";

}

}

 

public class Spainish  implements I18N{

public String getTitle() {

return "西班牙";

}

}

 

入口类

public class Software {

public static void main(String[] args) {

I18N i18n = I18NFactory.getI18NObject("spain");

 

System.out.println(i18n.getTitle());

}

}

 

其原理就是,假如说开发一个项目。需要实现不同的语言,比如一个网页可以任意切换语言。方便不同国家的人进行阅读。采用工厂模式可以简单的实现国际化开发,避免无用的重复劳动。

 

 

 

我在初学反射的时候,并不能理解反射是用来干嘛的。学了一些API发现:“明明我自己能直接new一个对象,为什么它要绕一个圈子,先拿到Class对象,再调用Class对象的方法来创建对象呢,这不是多余吗?

 

举个例子

一个数学运算的接口

public interface MathOperation {

    public float operate(int a , int b);

}

 

接着是实现类

/**

 * 加法

 */

public class Addition implements MathOperation {

    @Override

    public float operate(int a , int b) {

        System.out.println("执行加法运算");

        return a + b;

    }

}

 

/**

 * 减法运算

 */

public class Subtraction implements MathOperation {

    @Override

    public float operate(int a, int b) {

        System.out.println("执行减法运算");

        return a - b;

    }

}

 

 

    public static void case1(){

        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入计算类名:");

 

        String op = scanner.next();

        System.out.print("请输入a:");

        int a = scanner.nextInt();

        System.out.print("请输入b:");

        int b = scanner.nextInt();

 

 

 

 

        MathOperation mathOperation = null;

 

        if(op.equals("Addition")){

            mathOperation = new Addition();

        }

else if(op.equals("Subtraction")) {

            mathOperation = new Subtraction();

        }

else if(op.equals("Multiplication")){

            mathOperation = new Multiplication();

        }

else{

            System.out.println("无效的计算类");

            return;

        }

        float result = mathOperation.operate(a, b);

        System.out.println(result);

    }

 

    public static void main(String[] args) {

        ReflectSample.case1();

    }

 

这是为了解决工厂模式采用的反射机制

    public static void case2(){

        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入计算类名:");

        String op = scanner.next();

        System.out.print("请输入a:");

        int a = scanner.nextInt();

        System.out.print("请输入b:");

        int b = scanner.nextInt();

 

 

 

        MathOperation mathOperation = null;

        try {

            mathOperation = (MathOperation) Class.forName("com.imooc.reflect." + op).newInstance();

        }catch(Exception e){

            System.out.println("无效的计算类");

            return;

        }

        float result = mathOperation.operate(a, b);

        System.out.println(result);

    }

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值