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




相关文章
|
2天前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
23 4
|
2天前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
20 4
|
2天前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
12 1
|
27天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
114 43
Java学习十六—掌握注解:让编程更简单
|
2月前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
3月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
53 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
2月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
Java
Java的反射
Java的反射。
43 2
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。