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正确。

时间: 2024-08-28 03:17:59

Java中工厂、配置文件和反射学习的相关文章

JAVA中的糕富帅技术——反射(一)

前言 突然发现好久没写博客了,前面写的都是关于Android的东西,今天心血来潮突然有一种冲动想写一篇基于JAVA技术的博客,别问我为什么?有钱.任性! 今天就来谈谈反射机制:学过JAVA的人不一定懂得反射,但是一定听说过反射,不过也仅仅是听说过而已:因为反射用的地方也不会那么多,但是反射用的妙经常会解决我们挠破头皮的大问题.至于诸如为什么叫做反射.而不叫做正射倒射此类的历史问题,还是交给历史学家去研究吧... 反射的基石 在谈反射之前,我们应该先了解下类的概念来引入.类是一种抽象的概念,举个例

Java中的内省与反射

很多朋友在深入的接触Java语言后就会发现这样两个词:反射和内省,在什么场合下应用以及如何使用?今天把这二者放在一起介绍,因为它们二者是相辅相成的. 反射 相对而言,反射比内省更容易理解一点.用一句比较白的话来概括,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术.例如我们可以通过类名来生成一个类的实例:知道了方法名,就可以调用这个方法:知道了属性名就可以访问这个属性的值,还是写两个例子让大家更直观的了解反射的使用方法: //通过类名来构造一个类的实例 ClassClasscls_st

Java中使用配置文件——properties类

在java.util 包下面有一个类 Properties,该类主要用于读取项目中的配置文件(以.properties结尾的文件和xml文件). 使用示例: Java类: import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.concurrent.ScheduledExecutorService; import java.util.concurre

java中的try-catch-finnal异常处理(学习笔记)

一.异常概述 异常:Exception,是在运行发生的不正常情况. 原始异常处理: if(条件) { 处理办法1 处理办法2 处理办法3} if(条件) { 处理办法4 处理办法5 处理办法6} 代码阅读性差,臃肿不堪,与正常流程代码结合的很紧密,所以,在JAVA中进行一系列的改良,将一系列常见的问题,用面向对象的思考方式,对其进行了描述.封装. class 处理办法 { 处理办法1() { 举例1 } 处理办法2() { 举例2 } }if(出错了){ 抛出 new 处理办法1();此方法可能

java中读取配置文件的方法

转自:http://blog.csdn.net/stypace/article/details/38414871 一.使用org.apache.commons.configuration 需要使用的是jar包:commons-collections-3.2.1.jar.commons-configuration-1.10.jar.commons-lang-2.6.jar和commons-logging-1.2.jar. 可以读取的配置文件:xml和properties 1.读取xml文件 [ja

Java中类加载机制和反射技术

我们知道一个对象在运行时有两种类型,一个是编译类型,一个是运行时类型.在程序运行时,往往是需要发现类和对象的真实的信息的.那么如何获的这种信息呢? 其一,如果我们在编译和运行时都知道类型的具体信息,这时是可以手动将一个对象转换为运行时的类型. 其二,如果我们在编译时无法预知对象和类到底是属于哪些类,那么程序只有依靠运行时的信息来发现对象和类的真实的信息了,这时就必须要用到反射技术. 在谈具体的发射技术之前,我想先回顾下,有关类的加载的一些基本的性质和原理,以方便我们更好地理解,反射的作用和特点.

maven 打包 java中的配置文件

转发地址 http://www.cnblogs.com/liuzy2014/p/5981824.html 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,maven能把这些资源文件打包到相应的jar或者war里. 有时候,比如mybatis的mapper.xml文件,我们习惯把它和Mapper.java放一起,都在src/main/java下面,这样利用maven打包时,就需要修改pom.xml

java中读取配置文件

若是java web项目,项目运行于tomcat或其他容器时,可以使用下面方式来获取文件的输入流 1.当属性文件放在src下面时 InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties"); Properties p = new Properties(); p.load(is); 2.当属性文件放在某个包下面时,如:com.test.conf

java中读取配置文件中数据的具体方法

1.先在项目中创建一个包(如:config),再创建一个配置文件(如:a.properties),添加配置信息如下:比如 name=kaka age=28 2.代码: import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class PropertyTest {  public static void main(String[] args) {   PropertyT