Java中工厂、配置文件和反射学习

学习程序的最好方式就是编代码实现它,这里我们假设一个场景为要开一个晚会,晚会的流程为: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 stub
		System.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 stub
		System.out.println("小虎队舞蹈:爱");
	}

}

3.4定义Chenailian实现Dancleable接口

package com.gmail.lsgjzhuwei;

public class Chenailian implements Dancleable {

	public void dance() {
		// TODO Auto-generated method stub
		System.out.println("陈爱莲舞蹈:天鹅舞");
	}

}

3.5定义Zhaobenshan实现Essayable接口

package com.gmail.lsgjzhuwei;

public class Zhaobenshan implements Essayable {

	public void essay() {
		// TODO Auto-generated method stub
		System.out.println("赵本山小品:卖乖");
	}

}

3.6定义Liuqian实现Essayable接口
package com.gmail.lsgjzhuwei;

public class Liuqian implements Essayable {

	public void essay() {
		// TODO Auto-generated method stub
		System.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.Liudehua
Dancleable = com.gmail.lsgjzhuwei.Xiaohudui
Essayable = 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 block
			e.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 block
			e.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 block
			e.printStackTrace();
			throw new RuntimeException("对象不正确");
		}
	}
}

3.不用修改晚会类代码,执行程序,OK正确。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值