Java中工厂、配置文件和反射学习
来源:互联网 发布:淘宝店铺智能版 编辑:程序博客网 时间:2024/05/29 05:04
学习程序的最好方式就是编代码实现它,这里我们假设一个场景为要开一个晚会,晚会的流程为:1.晚会开始;2.唱歌;3.舞蹈;4.小品;5结束。
一、传统方法
1、新建java项目:party
2、在party项目中新建类EveningParty
package com.gmail.lsgjzhuwei;public class EveningParty {public static void main(String[] args){}}在EveningParty类中实现晚会的流程,新建process函数,在process函数中实现整个晚会流程,具体代码为:
public void process(){//1.晚会开始//2.唱歌//3.舞蹈//4.小品//5.晚会结束System.out.println("晚会开始");//唱歌Singable singable = new Liudehua();singable.sing();//跳舞Dancleable dancleable = new Xiaohudui();dancleable.dance();//小品Essayable essayable = new Zhaobenshan();essayable.essay();}
这里出现了三个类sIngable、Dancleable、和Essayable,为新建的接口,为了程序扩展方面,需要建立三个接口sIngable、Dancleable、和Essayable,分别用于实现唱歌跳舞和小品,具体的代码为:
package com.gmail.lsgjzhuwei;/** * @author Leo Chu *Singable接口用于实现唱歌 * 2014-8-24 */public interface Singable {public void sing();}
package com.gmail.lsgjzhuwei;/** * @author Leo Chu *Dancleable接口用于实现跳舞 * 2014-8-24 */public interface Dancleable {public void dance();}
package com.gmail.lsgjzhuwei;/** * @author Leo Chu *Essayable接口用于实现小品 * 2014-8-24 */public interface Essayable {public void essay();}
3.分别定义歌手、舞者和小品表演者分别实现上述接口
3.1定义Liudehua类实现Singable接口
package com.gmail.lsgjzhuwei;public class Liudehua implements Singable {public void sing() {// TODO Auto-generated method stubSystem.out.println("刘德华演唱中国人");}}
3.2定义Naying实现Sinable接口
package com.gmail.lsgjzhuwei;public class Naying implements Singable{public void sing(){System.out.println("那英演唱:雾里看花");}}
3.3定义Xiaohudui实现Dancleable接口
package com.gmail.lsgjzhuwei;public class Xiaohudui implements Dancleable {public void dance() {// TODO Auto-generated method stubSystem.out.println("小虎队舞蹈:爱");}}
3.4定义Chenailian实现Dancleable接口
package com.gmail.lsgjzhuwei;public class Chenailian implements Dancleable {public void dance() {// TODO Auto-generated method stubSystem.out.println("陈爱莲舞蹈:天鹅舞");}}
3.5定义Zhaobenshan实现Essayable接口
package com.gmail.lsgjzhuwei;public class Zhaobenshan implements Essayable {public void essay() {// TODO Auto-generated method stubSystem.out.println("赵本山小品:卖乖");}}
3.6定义Liuqian实现Essayable接口
package com.gmail.lsgjzhuwei;public class Liuqian implements Essayable {public void essay() {// TODO Auto-generated method stubSystem.out.println("刘谦魔术:水中捞月");}}4.修改主函数中代码
package com.gmail.lsgjzhuwei;public class EveningParty {public static void main(String[] args){new EveningParty().process();}public void process(){//1.晚会开始//2.唱歌//3.舞蹈//4.小品//5.晚会结束System.out.println("晚会开始");//唱歌Singable singable = new Liudehua();singable.sing();//跳舞Dancleable dancleable = new Xiaohudui();dancleable.dance();//小品//Essayable essayable = new Zhaobenshan();essayable.essay();System.out.println("晚会结束");}}
OK,程序可以正常运行。
但是程序这么写的话会出现一个问题:每次更好演员的时候需要修改晚会类的代码,这就给程序的扩展和维护带来了不便。那应该怎么做呢?可不可以吧这些麻烦的修改部分外包给一个代理去做,由代理类完成演员的修改,这就是我们下面要介绍的一种方法:用Factory类做代理负责代码的修改。
二/利用factory类,把需要变化的部分放到factory类中
1.在上面程序的基础上新建Factory类,
package com.gmail.lsgjzhuwei;import java.util.ResourceBundle;public class Factory {public Singable getSingable(){return new Liudehua();}public Dancleable getDancleable() {return new Xiaohudui();}public static Essayable getEssayable(){return new Zhaobenshan();}}
2.修改晚会类代码
package com.gmail.lsgjzhuwei;public class EveningParty {public static void main(String[] args){new EveningParty().process();}public void process(){//1.晚会开始//2.唱歌//3.舞蹈//4.小品//5.晚会结束System.out.println("晚会开始");////唱歌//Singable singable = new Liudehua();//singable.sing();//////跳舞//Dancleable dancleable = new Xiaohudui();//dancleable.dance();//////小品//Essayable essayable = new Zhaobenshan();//essayable.essay();Factory factory = new Factory();factory.getSingable().sing();factory.getDancleable().dance();factory.getEssayable().essay();System.out.println("晚会结束");}}
OK,也是可以运行的
用这种方法不用修改晚会类,但是还是要修改代码,还有一种方法就是将演员的实例类写入配置文件
三、映射方法
1.在上面代码的基础上,在src目录下新建party.properties类,将演员的实例类写入配置文件,代码为:
Singable = com.gmail.lsgjzhuwei.LiudehuaDancleable = com.gmail.lsgjzhuwei.XiaohuduiEssayable = com.gmail.lsgjzhuwei.Zhaobenshan2.修改Factory类中调用演员类的代码:
package com.gmail.lsgjzhuwei;import java.util.ResourceBundle;public class Factory {public static Singable getSingable(){String className = ResourceBundle.getBundle("party").getString("Singable");try {Object obj = Class.forName(className).newInstance();return (Singable) obj;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();throw new RuntimeException("对象不正确");}}public static Dancleable getDancleable() {String className = ResourceBundle.getBundle("party").getString("Dancleable");try {Object obj = Class.forName(className).newInstance();return (Dancleable) obj;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();throw new RuntimeException("对象不正确");}}public static Essayable getEssayable(){String className = ResourceBundle.getBundle("party").getString("Essayable");try {Object obj = Class.forName(className).newInstance();return (Essayable) obj;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();throw new RuntimeException("对象不正确");}}}
3.不用修改晚会类代码,执行程序,OK正确。
1 0
- Java中工厂、配置文件和反射学习
- Java中工厂、配置文件和反射学习
- 浅析反射、工厂和配置文件
- Java中通过dom4j读取配置文件实现抽象工厂+反射
- Java中通过dom4j读取配置文件实现抽象工厂+反射
- Java中通过dom4j读取配置文件实现抽象工厂+反射
- Java学习笔记----工厂模式和反射
- Java反射 配置文件 工厂方法综合实例
- java反射机制+工厂模式+配置文件----->在谈到spring配置文件
- Java反射和工厂模式
- 配置文件+反射+简单工厂
- 抽象工厂+反射+配置文件
- C++ 工厂+反射+配置文件
- 设计模式学习之简单工厂+反射+配置文件
- [Java 15 反射机制 ] 工厂模式与 properties 读取配置文件
- 机房重构之配置文件、反射和抽象工厂
- 利用“工厂模式+反射+配置文件”来实现解耦和
- java反射学习(结合工厂方法)
- 使用android studio的gradle新建项目时候出现No cached version listing 或Enable Gradle 'offline mode'
- 理解A*寻路算法具体过程
- hdu1874畅通工程续dijkstra
- maven仓库的本地设置
- swift常量和变量的命名规则
- Java中工厂、配置文件和反射学习
- 字符串的基本操作
- 美名其曰天天复利--哪个应该持久化
- IOS在后台每隔一段时间执行一下
- Linux下常用命令
- android电话状态的监听
- centos iptables开启端口
- Visual Studio控制台程序输出窗口一闪而过的解决方法
- swift常用的数据类型