前言
工厂类,是用来创建对象的。这里不说设计模式啥的,只要知道任何的工厂类都是用来创建对象的。
DAO工厂类,是用来创建DAO对象的,即数据访问对象(关于DAO,见http://my.oschina.net/diedai/blog/533085)
UML
示例代码
1、DAO工厂类接口
package com.bigning.db;
import com.bigning.Important;
import com.bigning.ImportantLevel;
/**
* DAL 对象生成器
*
* @see AbstractDalFactoryImpl
*/
@Important(ImportantLevel.High)
public interface AbstractDalFactory {
/**
* 创建数据访问对象
*
* @return 生成的Dal对象
*/
public ComDal create();
/**
* 取得连接生成器工厂
*
* @return 连接工厂
*/
public ConnectionGeneratorFactory getConnectionFactory();
}
2、抽象实现
/*
* Created on 2006-2-10
*/
package com.bigning.db;
import java.lang.reflect.Constructor;
import com.bigning.Important;
import com.bigning.ImportantLevel;
import com.bigning.db.pool.ConnReleaseListener;
import com.bigning.db.pool.PoolableConnectionGenerator;
import com.bigning.db.pool.PoolableConnectionGeneratorFactory;
import com.bigning.util.ResourceSetting;
/**
* Dal 对象生成器的抽象实现
* @author fantasy
* @see DefaultDalFactory
*/
@Important(ImportantLevel.High)
public abstract class AbstractDalFactoryImpl implements AbstractDalFactory{
private class DalFactoryWrapper implements AbstractDalFactory{
ConnectionGeneratorFactory cgf;
Constructor<ComDal> dalCtor;
Object []args;
DalFactoryWrapper(ConnectionGeneratorFactory cgf,Constructor<ComDal> dalCtor, Object []args){
this.cgf=cgf;
this.dalCtor=dalCtor;
this.args=args;
}
public ComDal create() {
try{
return dalCtor.newInstance(args);
}catch(Exception ex){
ex.printStackTrace();
}
return null;
}
public ConnectionGeneratorFactory getConnectionFactory(){
return cgf;
}
}
static Class<?> []COMMON_ARG_TYPES={ConnectionGenerator.class};
static Class<?> []POOL_ARG_TYPES={PoolableConnectionGenerator.class,ConnReleaseListener.class};
private AbstractDalFactory factory;
private ConnectionGeneratorFactory cgf;
/**
* 通过连接生成工厂和资源文件来构建一个Dal工厂
* @param cgf 连接生成工厂
* @param rs 资源文件
* @throws Exception
*/
public AbstractDalFactoryImpl(ConnectionGeneratorFactory cgf,ResourceSetting rs) throws Exception{
this.cgf=cgf;
factory=doBuildFactory(rs);
}
/**
* 通过资源文件来构建一个工厂
* @param rs 资源文件
* @return 连接生成工厂
* @throws Exception
*/
protected AbstractDalFactory doBuildFactory(ResourceSetting rs) throws Exception {
boolean poolable=Boolean.valueOf(rs.getProperty("jdbc.poolable")).booleanValue() ;
Class<ComDal> dalClass;
Class<?> []dalArgTypes;
Object []args;
ConnectionGeneratorFactory x=cgf;
if(!poolable){
dalClass=doLoadDalClass();
dalArgTypes=COMMON_ARG_TYPES;
args=new Object[]{cgf.create()};
}else{
dalClass=doLoadPoolDalClass();
dalArgTypes=POOL_ARG_TYPES;
PoolableConnectionGeneratorFactory cgf2=new PoolableConnectionGeneratorFactory(rs,cgf);
args=new Object[]{cgf2.create(),cgf2.getConnectionPool()};
x=cgf2;
}
Constructor<ComDal> dalCtor=(Constructor<ComDal>)dalClass.getConstructor(dalArgTypes);
AbstractDalFactory factory=new DalFactoryWrapper(x,dalCtor,args);
return factory;
}
protected abstract Class<ComDal> doLoadDalClass() throws Exception;
protected abstract Class<ComDal> doLoadPoolDalClass() throws Exception;
public ComDal create() {
return factory.create();
}
public ConnectionGeneratorFactory getConnectionFactory(){
return cgf;
}
}
3、实现类
/*
* Created on 2004-3-4
*
*/
package com.bigning.db;
import com.bigning.Important;
import com.bigning.ImportantLevel;
import com.bigning.util.ResourceSetting;
/**
* DAO工厂类,用于创建DAO对象<p>
*
* 注:该类在配置文件里配置(application.setting.properties)。
* @author Administrator
*
*/
@Important(ImportantLevel.Low)
public class DefaultDalFactory extends AbstractDalFactoryImpl {
/**
* @throws Exception
*
*/
public DefaultDalFactory(ConnectionGeneratorFactory f,ResourceSetting rs) throws Exception {
super(f,rs);
}
@SuppressWarnings("unchecked")
@Override
protected Class<ComDal> doLoadDalClass() throws Exception {
Class<ComDal> dalClass=(Class<ComDal>) Class.forName("com.bigning.db.AbstractDal");
return dalClass;
}
@SuppressWarnings("unchecked")
@Override
protected Class<ComDal> doLoadPoolDalClass() throws Exception {
Class<ComDal> dalClass=(Class<ComDal>)Class.forName("com.bigning.db.pool.PoolableComDal");
return dalClass;
}
}