反射模式优化工厂类大量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. [转] kaldi中FST的可视化-以yesno为例

    http://blog.csdn.net/u013677156/article/details/77893661 1.kaldi解码过程 kaldi识别解码一段语音的过程是:首先提取特征,然后过声学模 ...

  2. 腾讯开源 MMKV — 基于mmap的高性能通用key-value组件

    一.介绍 MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强.从 2015 年中至今,在 iOS 微信上使用已有近 3 ...

  3. 音视频编解码——LAME

    一.LAME简介 LAME是目前非常优秀的一种MP3编码引擎,在业界,转码成Mp3格式的音频文件时,最常用的就是LAME库.当达到320Kbit/s时,LAME编码出来的音频质量几乎可以和CD的音质相 ...

  4. Oracle实战笔记(第一天)

    导读 笔记内容来自韩顺平老师的视频<玩转Oracle实战教程>,可以结合笔记进行观看.第一天视频中还有Oracle的介绍和安装等内容,很容易搜索到,这里就不再进行总结. 目录 1.命令行工 ...

  5. JavaScript 快速入门

    JavaScript是jquery的基础, JavaScript是一种描述性语言 JavaScript的组成 :ECMAScript,BOM,DOM. JavaScript的基本结构 <scri ...

  6. redux源码学习笔记 - combineReducers

    上一篇有了解到,reducer函数的两个为:当前state和此次dispatch的action. state的结构是JavaScript对象,每个key都可以代表着不同意义的数据.比如说 { list ...

  7. 浅谈模块系统与 ABP 框架初始化

    在 ABP 框架当中所有库以及项目都是以模块的形式存在,所有模块都是继承自AbpModule 这个抽象基类,每个模块都拥有四个生命周期.分别是: PreInitialze(); Initialize( ...

  8. IndexedDB 简单封装

    IndexedDB 浏览器数据库,是一个非关系型数据库,数据形式使用的是json,IndexedDB适合存储大量数据,它的API是异步调用的,当然他的api 也相对复杂. 当然浏览器数据存储 还有Lo ...

  9. AspNetCore微服务下的网关-Kong(一)

    Kong是Mashape开源的高性能高可用API网关和API服务管理层.它基于OpenResty,进行API管理,并提供了插件实现API的AOP.Kong在Mashape 管理了超过15,000 个A ...

  10. HDU 1006 Digital Roots

    Problem Description The digital root of a positive integer is found by summing the digits of the int ...