这一章主要讲两种设计模式:

建造者设计模式和工厂设计模式,这两种设计模式在持久层框架基本上都是一起出现,建造者用于加载资源为工厂做好准备,工厂专门用来生产具体对象。

这里的资源往往是框架开放给用户自定义的信息,比如:数据库配置信息、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=2public 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);}}
@Testpublic 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();//根据工厂创建sessionSession hibernateSession=hibernatFactory.createSession(dbhibernate);//创建mybatissession工厂SessionFactory mybatisFactoy=new MybatisFactory();Session mybatissession=mybatisFactoy.createSession(dbbatis);}

J2EE框架(四)核心设计模式相关推荐

  1. Java开源——常见J2EE框架简介

    Java开源--常见J2EE框架简介 Spring Framework Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口 ...

  2. Activiti源码分析(框架、核心类。。。)

    Activiti源码分析(框架.核心类...) 目录 概 述 activiti源码分析(一)设计模式 总结: 相关工具如下: 分析: 小结: 参考资料和推荐阅读 LD is tigger foreve ...

  3. 浅谈javaweb三大框架和MVC设计模式

    浅谈javaweb三大框架和MVC设计模式 转载自:http://blog.csdn.net/sunpeng19960715/article/details/50890705 小序:博主以前在学jav ...

  4. 软考常考的四种设计模式

    软考常考的四种设计模式 1.观察者模式 1. 定义 2. 类型 3. 别名 4. 角色 5. 类图 2.桥接模式 1. 定义 2. 类型 3. 角色 4. 类图 3.访问者模式 1. 定义 2. 类型 ...

  5. J2EE框架设计技术分析

    设计目标: 1.       开发效率 2.       性能.预算 3.       符合OO设计 4.       避免复杂性 5.       可维护性.可扩展性,可重用性 分布式应用 不足: ...

  6. 【金三银四】设计模式面试题(2021最新版)

    目录 前言 1.什么是设计模式 2.为什么要学习设计模式 3.设计模式分类 4.设计模式的六大原则 5.单例模式 5.1 什么是单例 5.2 哪些地方用到了单例模式 5.3 单例优缺点 5.4 单例模 ...

  7. 框架模式与设计模式之区别

    http://my.oschina.net/u/991183/blog/109854  有很多程序员往往把框架模式和设计模式混淆,认为MVC是一种设计模式.实际上它们完全是不同的概念. 框架.设计模式 ...

  8. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  9. 框架模式和设计模式的区别

    框架模式和设计模式的区别 有很多程序员往往把框架模式和设计模式混淆,认为MVC是一种设计模式.实际上它们完全是不同的概念.[7] 框架.设计模式这两个概念总容易被混淆,其实它们之间还是有区别的. 框架 ...

  10. Hadoop精华问答:Hadoop框架最核心的设计是?

    2006年项目成立的一开始,"Hadoop"这个单词只代表了两个组件--HDFS和MapReduce.到现在的13个年头,这个单词代表的是"核心",今天我们就来 ...

最新文章

  1. nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
  2. C++之变量的作用域,生存期,可见性
  3. 特斯拉自动驾驶系统秘密,来自特斯拉AI总监爆料
  4. 《CCNP TSHOOT 300-135学习指南》——1.2节结构化故障检测与排除方法
  5. mysql大于等于怎么写_MySQL 对于千万级的大表要怎么优化?我写了6000字的深度解读...
  6. LINUX下载编译wabt(反编译wasm)
  7. Python 求峰值
  8. 盘点微信的前世今生,微信成功的必然和偶然
  9. appcan中,地图插件调用百度导航
  10. 聚类有效性指标(CVI)
  11. RAID(独立磁盘冗余阵列)
  12. 硬件课程设计—电梯控制系统
  13. 战略升级|蜜拓蜜·蜜女王集团战略升级,更名“京沅”集团
  14. python画心形代码大全_Python代码合集看点 机器人算法、自动导航算法算法大全...
  15. Solidworks2016安装的时候遇到下面问题
  16. 电脑无法登录TIM / QQ的一种解决方案
  17. T45 LaTex特殊符号
  18. thinkjdbc 关闭_变向关闭thinksns的缓存
  19. 独立表情包壁纸喝酒神器功能微信小程序源码
  20. react antd-mobile v2图片选择器ImagePicker压缩图片上传腾讯云COS处理方案

热门文章

  1. Microsoft sqlserver2000如何导入.mdf格式的数据库文件
  2. 最新好用的服装零售进销存软件排行榜
  3. Git报错:Pulling without specifying how to reconcile divergent branches is discouraged. You can squelch
  4. 西门子S7-200SMART四种密码解密软件
  5. c语言中lookup函数功能,Lookup函数以及0/的用法
  6. 360无线网卡驱动 linux驱动,小度Wifi、360Wifi Windows、linux驱动
  7. 绿云酒店管理系统 服务器要求,绿云宾馆管理软件系统基础-20210728170313.docx-原创力文档...
  8. 基于SSM开发的的小区物业管理系统小程序源码
  9. MySQL数据库应用与实践教程答案_MySQL数据库应用与实践教程(21世纪高等学校计算机教育实用规划教材)...
  10. Win10中卸载IE11