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.Zhaobenshan
2.修改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