反射模式优化工厂类大量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 判断,以后在加一个除法,只需要创建要给除法类,在配置文件加一个配置即可,不需要再修改工程类

java 反射模式的更多相关文章

  1. java 反射的应用 以及通过反射 用到的工厂模式

    java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案 ...

  2. 【设计模式】学习笔记17:代理模式之保护代理与Java反射

    本文出自   http://blog.csdn.net/shuangde800 本笔记内容: 1. Java动态代理,反射机制 2. 保护代理 3. 应用保护代理实现的约会系统 ----------- ...

  3. java反射机制(工厂模式)

    http://www.phpddt.com/dhtml/338.html java里面没有typeof,js有. 我终于实现了用反射机制编写的工厂模式.java反射在工厂模式可以体现. 包含产品接口类 ...

  4. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

  5. Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  6. Java反射机制与工厂模式

    工厂模式属于创建型模式,它提供了一种创建对象的最佳方式. 它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象. 简单工厂模式如下: inter ...

  7. 工厂方法模式(JAVA反射)

    简单工厂模式的不足     在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类.简单工厂模式最大的缺点是当有新 ...

  8. Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

    IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...

  9. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

随机推荐

  1. Canal学习笔记(服务端)

    canal服务端 canal服务端有两种运行模式,一种单机模式,一种HA运行模式(zk保证) 单机模式:同步的binlog节点信息保存在本地(/conf/{自定义分区文件夹}/),meta.dat H ...

  2. shell脚本执行错误 $'\r':command not found

    shell脚本执行错误 $'\r':command not found Linux下有命令dos2unix 可以用一下命令测试 vi -b filename 我们只要输入dos2unix *.sh就可 ...

  3. [Swift]Alamofire:设置网络请求超时时间【timeout】的两种方式

    两种方式作用相同,是同一套代码的两种表述. 第一种方式:集聚. 直接设置成员属性(全局属性),这种方法不能灵活修改网络请求超时时间timeout. 声明为成员属性: // MARK: - 设置为全局变 ...

  4. while(true)应用之 实现自己的消息队列

    早些时候,一直有个疑问,就是比如你从前端发一个操作之后,后台为什么能够及时处理你的东西呢?当然了,我说的不是,服务器为什么能够立即接收到你的请求之类高大上的东西.而是,假设你用异步去做一个事情,而后台 ...

  5. Python之父:为什么操作符很有用?

    这是我在python-ideas上发布的一些东西,但我认为这些很有趣,应该分享给更多的人. 最近有很多关于合并两个dict(词典)的运算符的讨论. 这促使我思考为什么有些人喜欢运算符,我想起了30多年 ...

  6. Python图像处理库PIL中图像格式转换

    o 在数字图像处理中,针对不同的图像格式有其特定的处理算法.所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现.本文基于这个需求,使用python中的图像处理库PIL ...

  7. 原生js实现返回顶部特效

    index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  8. Linux 用脚本编写搭建yum本地仓库

    Linux 用脚本编写搭建yum本地仓库 源码如下: #!/bin/bash #该脚本用于自动化搭建本地yum仓库 #挂载光盘 #作者:雨中落叶 #博客:https://www.cnblogs.com ...

  9. virtualbox ubuntu 安装 openssh-server

    最近为了学 DevOps,自己动手在 virtualbox 上安装 ubuntu 系统,安装完后发现好坑,没办法用 XShell 连接.在线安装 openssh-server 又发现没有配置软件源,手 ...

  10. Xamarin.Android 使用 SimpleAdapter 打造 ListView 万能适配器

    第一步:创建 layout1.axml 来展示列表详细内容 <?xml version="1.0" encoding="utf-8"?> <L ...