在经典三层架构中(好像在所有的程序开发中也一样)都应该遵循高内聚低耦合的通用规范,现实中,web层(一般是servlet或者structs中的action)用于控制程序流转,例如执行判断、调用service层的业务方法,由service层负责调用dao层访问数据库的方法,在层与层之间都需要创建被调用层的实例对象,导致程序出现高耦合的情况,本文目的就是希望利用工厂类实现三层互访完整解耦操作,由于技术有限,错漏再所难免,欢迎指正,可以博客留言,也可以Email通知:flowerswilt@gmail.com
以一个简单客户管理的添加客户为例,程序包如下:
com.blogger.flowerswilt.web //servlet或者action com.blogger.flowerswilt.service //业务方法 com.blogger.flowerswilt.dao //数据库访问 com.blogger.flowerswilt.utils //工具类 /* javabean Cust 提供对应数据库的字段,并生成get、set方法 */ com.blogger.flowerswilt.bean com.blogger.flowerswilt.factory //工厂类
我们应当尽量使用面向接口的编程思想,在dao的包中创建对应Javabean的dao接口,也就是CustDao,并创建这个接口的实现类,即CustDaoImpl。
service包同理,即CustService接口、CustServiceImpl实现类。
有了这样的模型,其实我们已经可以通过分别创建CustDaoFactory 与CustServiceFactory两个工厂类实现解耦操作,这样做的话,程序增加Dao或者Service都需要创建对应的Factory ,容易导致代码臃肿,同时不利于维护。
因此,我们可以通过一个BaseDaoFactory类来实现。
此过程,需要一个properties配置文件,内容如下:
CustDao=com.blogger.flowerswilt.dao.CustDaoImpl CustService=com.blogger.flowerswilt.service.CustServiceImpl
文件主要为了说明接口与实现类的对应关系。
BaseDaoFactory代码如下:
------------------------------------------------------------------------------------------------------------
package com.blogger.flowerswilt.factory;
import java.io.FileInputStream;
import java.util.Properties;
public class BaseDaoFactory {
private static Properties properties = null;
private static BaseDaoFactory baseDaoFactory = new BaseDaoFactory(){};
private BaseDaoFactory() {
// 私有化构造函数
}
static{ //读取配置文件
try { //配置文件必须放置于类加载路径目录
properties.load(new
FileInputStream(BaseDaoFactory.class.getClassLoader().getResource("config.properties").getPath()));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static BaseDaoFactory getFactory(){
return baseDaoFactory;
}
public static T getInstance(Class clazz){
//获取接口的名称
String cName = clazz.getSimpleName();
//通过接口名称获取对应实现类名称
String cClaszz = properties.getProperty(cName);
try {
//利用类名,实例化对象并返回
return (T) Class.forName(cClaszz).newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}------------------------------------------------------------------------------------------------------------
上面的代码,最关键的部分在于getInstance方法,从方法声明中可以看到,我们在调用的时候需要提供一个class对象,比如我们需要CustDaoImpl实例对象时,可以这样调用:
CustDao custDao = BaseDaoFactory.getFactory().getInstance(CustDao.class);
将CustDao.class作为参数传递给getInstance,进入getInstance方法内部,
String cName = clazz.getSimpleName();
变量cName将获取到“CustDao”字符串。
String cClaszz = properties.getProperty(cName);
通过properties配置文件,变量cClaszz 将获得CustDaoImpl的完整类名。
return (T) Class.forName(cClaszz).newInstance();
利用Class对象和完整类名,返回CustDaoImpl的实例对象。
通用类的好处是,无论想要获得哪个对象的实例,只需要在配置文件中声明该对象与接口的对应关系,并将该对象的class作为参数传递给通用类,就能完成该对象的实例化。
呃,不知道是好久不写东西还是边敲代码边写这个博客的问题,整篇文章惨不忍睹,大家凑合着看吧,我也懒得重新整理了。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)

[z][l][n]2015天猫双11来啦!各大会场活动页面就来→ http://www.20151111.xyz
[神龙][糖果][粉蛋糕]2015双11活动来啦!各大会场活动页面就来→ http://www.20151111.xyz
[bofu累]推荐阅读:【中传校花袁千山电眼勾人 美艳娇俏甜美少女味】→ http://t.cn/RymfPX3
请博主继续发好贴,支持你