持久层之DAO工厂类

前言

工厂类,是用来创建对象的。这里不说设计模式啥的,只要知道任何的工厂类都是用来创建对象的。

DAO工厂类,是用来创建DAO对象的,即数据访问对象(关于DAO,见http://my.oschina.net/diedai/blog/533085)


UML

155811_Mmak_1027544.png

示例代码

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;
	}

}


转载于:https://my.oschina.net/diedai/blog/533338

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值