JavaWeb学习篇——使用通用工厂类解耦MVC框架

通过使用经典的MVC(model、view、controller)三层开发框架,可以使我们的项目结构更符合模块化的特点,各层(web、service、dao)只负责本层最擅长的工作。当某一层的业务逻辑需要重新调整时,则只需要修改该层的代码即可,其他各层均不受影响,方便整个项目的随时开发和维护。

  • web层:接受请求、控制程序流转(servlet,即controller),展示数据(jsp,即view)。
  • service层:处理业务逻辑,封装数据(javabean),即model。
  • dao层:处理数据访问。

本文主要介绍如何通过定义一个通用工厂类来实现MVC框架开发中各层间的解耦,通过进一步的解耦操作,可以加强各层间代码的独立性。具体程序代码如下:

package com.empiresteven.factory;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Properties;
import javax.persistence.Basic;

//定义一个通用的工厂类,用于解除MVC三层框架中各层之间的耦合
public class BasicFactory {
	//在工厂类内部维护一个静态的实例对象,供外界调用
	private static BasicFactory factory = new BasicFactory();
	//定义属性对象,从属性文件中读取各层接口对应实现类的全路径
	private static Properties property = null;
	//私有化构造函数
	private BasicFactory(){
	}
	//对外提供获取工厂类静态实例对象的接口
	public static BasicFactory getFactory(){
		return factory;
	}
	//当工厂类被加载到内存中,则执行静态代码块,初始化属性对象
	static{
		property = new Properties();
		try {
			//通过工厂类获取类加载器,得到类加载路径下的属性文件的硬盘路径,构造reader
			FileReader reader = new FileReader(
					BasicFactory.class.getClassLoader().getResource("config.properties").getPath());
			//加载属性文件内容到内存对象中,完成初始化操作
			property.load(reader);
		} catch (Exception e) {
			//打印异常抛出的跟踪路径
			e.printStackTrace();
			//向Java虚拟机抛出运行时异常
			throw new RuntimeException(e);
		}	
	}
	
	/**
	 * 通过工厂类获取各层接口的实现类对象
	 * @param  泛型,各层接口的实现类
	 * @param clazz 需要获取的层接口的Class对象
	 * @return 该层的实现类对象
	 */
	public  T getInstance(Class clazz){
		//获取class对象的类型名,即层接口名
		String interfaceName = clazz.getSimpleName();
		//从属性文件中读取该层接口所对应的实现类的全路径
		String implName = property.getProperty(interfaceName);
		try {
			//加载接口实现类的Class对象,从而创建出该实现类的实例对象并返回
			return (T) Class.forName(implName).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}

你可能感兴趣的:(JavaWeb)