这一章主要讲两种设计模式:
建造者设计模式和工厂设计模式,这两种设计模式在持久层框架基本上都是一起出现,建造者用于加载资源为工厂做好准备,工厂专门用来生产具体对象。
这里的资源往往是框架开放给用户自定义的信息,比如:数据库配置信息、spring上下文配置信息。建造者模式负责把这些信息加载到内存并封装到一个对象中。
工厂模式利用构建在内存中的对象,来创建具体的某个对象(比如:session)
因此
1、 建造者我们只需要构建一次——把持久化数据(配置文件信息)内存化(封装到内存中),构建者的使命就算完成。
2、 工厂会一直产生各种对象,所以工厂在整个框架中一直存在,一般情况下只存在一个单列对象。
1、建造者类图
2、工厂模式类图
框架代码模拟:
模拟内容为获取mybatis和hibernate 的session, 先用建造者模式加载配置文件构建出产品DBEntity(保存配置文件信息-也就是内存化),再把产品交给工厂创建出不同的session
建造者模式
/**
* 产品
* @author chenDong
*
*/
public class DBEntity {
private String db_url; //数据库连接
private String db_driverName; //驱动
private String db_userName;//用户名
private String db_password;//用户密码
private String db_dialect;//hibernate方言
private String db_tag;//框架标志,mybaits=1,hibernate=2
public String getDb_tag() {
return db_tag;
}
public void setDb_tag(String db_tag) {
this.db_tag = db_tag;
}
public String getDb_url() {
return db_url;
}
public void setDb_url(String db_url) {
this.db_url = db_url;
}
public String getDb_driverName() {
return db_driverName;
}
public void setDb_driverName(String db_driverName) {
this.db_driverName = db_driverName;
}
public String getDb_userName() {
return db_userName;
}
public void setDb_userName(String db_userName) {
this.db_userName = db_userName;
}
public String getDb_password() {
return db_password;
}
public void setDb_password(String db_password) {
this.db_password = db_password;
}
public String getDb_dialect() {
return db_dialect;
}
public void setDb_dialect(String db_dialect) {
this.db_dialect = db_dialect;
}
}
/**
* 构建接口
* @author chenDong
*
*/
public interface DBBuilder {
/**
* 根据配置文件获取mybaits必须信息
* @param configPath 配置路径
*/
public void configMybatis(String configPath);
/**
* 根据配置文件获取hibernate必须信息
* @param configPath 配置路径
*/
public void configHibernate(String configPath);
/**
* 设置mybaits标志
*/
public void mybatisTag();
/**
* 设置hibernate标准
*/
public void hibernateTag();
/**
* 创建具体的产品(hibernate或mybatis)
* @return
*/
public DBEntity createEntity();
}
/**
* 具体构建
* @author Administrator
*
*/
public class ConcreteBuilder implements DBBuilder {
/**
* 创建框架实体对象对象
*/
private DBEntity dbEntity=new DBEntity();
public void configMybatis(String configPath) {
//从配置文件读取信息设置到实体对象中省略
// dbEntity.setDb_driverName(db_driverName);
// dbEntity.setDb_password(db_password);
// dbEntity.setDb_url(db_url);
}
public void configHibernate(String configPath) {
//从配置文件读取信息设置到实体对象中省略
// dbEntity.setDb_driverName(db_driverName);
// dbEntity.setDb_password(db_password);
// dbEntity.setDb_url(db_url);
// dbEntity.setDb_dialect(db_dialect);//多了方言
}
public void mybatisTag() {
//设置标志为1为mybatis,MYBAITISTAG常量值为1
// dbEntity.setDb_tag(MYBAITISTAG);
}
public void hibernateTag() {
//设置标志为2为,HIBERNATETAG常量值为2
// dbEntity.setDb_tag(HIBERNATETAG);
}
/**
* 返回产品
*/
public DBEntity createEntity() {
return dbEntity;
}
}
/**
* 总导演,由总导演确定构建hibernate还是mybatis
* @author chenDong
*
*/
public class Director {
//持有构建者
private DBBuilder builder;
public Director(DBBuilder builder){
this.builder=builder;
}
/**
* 具体有导演类指导构建hibernate信息实体
* @param configPath 配置文件路径
* @return hibernate信息实体
*/
public DBEntity buildHibernate(String configPath){
builder.configMybatis(configPath);
builder.mybatisTag();
return builder.createEntity();
}
/**
* 具体有导演类指导构建mybaitis信息实体
* @param configPath 配置文件路径
* @return mybatis信息实体
*/
public DBEntity buildMybatis(String configPath){
builder.configMybatis(configPath);
builder.mybatisTag();
return builder.createEntity();
}
}
工厂模式:
/**
* Session接口
* @author chenDong
*
*/
public interface Session {
public Connection createSession();
}
/**
* hibernatreSession 具体的实现
* @author chenDong
*
*/
public class HibernateSession implements Session{
//持有构建出来的创建连接的对象
private DBEntity dbEntity;
public HibernateSession(DBEntity dbEntity){
this.dbEntity=dbEntity;
}
public Connection createSession() {
//根据dbEntity信息创建hibernate连接省略
return null;
}
}
/**
*mybatissession 具体的实现
* @author chenDong
*
*/
public class MyBatisSession implements Session {
//持有构建出来的创建连接的对象
private DBEntity dbEntity;
public MyBatisSession(DBEntity dbEntity){
this.dbEntity=dbEntity;
}
public Connection createSession() {
//根据dbEntity信息创建mybats连接省略
return null;
}
}
/**
* session工厂
* @author Administrator
*
*/
public interface SessionFactory {
/**
* 根据数连接信息创建Session
* @param dbEntity
* @return
*/
public Session createSession(DBEntity dbEntity);
}
/**
* hibernate工厂
* @author Administrator
*
*/
public class HibernateSessionFactory implements SessionFactory{
public Session createSession(DBEntity dbEntity) {
return new HibernateSession(dbEntity);
}
}
/**
* mybatis工厂
* @author chenDong
*
*/
public class MybatisFactory implements SessionFactory{
public Session createSession(DBEntity dbEntity) {
return new MyBatisSession(dbEntity);
}
}
@Test
public void testDB(){
//创建构建者
DBBuilder builder=new ConcreteBuilder();
//创建导演
Director director=new Director(builder);
//获得构建出的产品,数据库连接信息
DBEntity dbbatis=director.buildMybatis("configPath");
DBEntity dbhibernate=director.buildHibernate("configPath");
//创建hibernatesession工厂
SessionFactory hibernatFactory=new HibernateSessionFactory();
//根据工厂创建session
Session hibernateSession=hibernatFactory.createSession(dbhibernate);
//创建mybatissession工厂
SessionFactory mybatisFactoy=new MybatisFactory();
Session mybatissession=mybatisFactoy.createSession(dbbatis);
}