前言
工厂类,是用来创建对象的。这里不说设计模式啥的,只要知道任何的工厂类都是用来创建对象的。
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; ConstructordalCtor; Object []args; DalFactoryWrapper(ConnectionGeneratorFactory cgf,Constructor 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 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 dalCtor=(Constructor )dalClass.getConstructor(dalArgTypes); AbstractDalFactory factory=new DalFactoryWrapper(x,dalCtor,args); return factory; } protected abstract Class doLoadDalClass() throws Exception; protected abstract Class 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对象* * 注:该类在配置文件里配置(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
doLoadDalClass() throws Exception { Class dalClass=(Class ) Class.forName("com.bigning.db.AbstractDal"); return dalClass; } @SuppressWarnings("unchecked") @Override protected Class doLoadPoolDalClass() throws Exception { Class dalClass=(Class )Class.forName("com.bigning.db.pool.PoolableComDal"); return dalClass; }}