黑马程序员技术交流社区

标题: 利用工厂模式来配置数据访问层 [打印本页]

作者: 谭立文    时间: 2012-10-8 11:33
标题: 利用工厂模式来配置数据访问层
  JDBC的学习将近一半,给我的感觉JDBC不是什么新的技术,只是通过前面学习的Database,Java基础和Java基础加强来建立一个对数据库的访问,如何优化代码,优化查询的学习,也就是Java database connection.
  到目前为止觉得比较重要的一个思想或者说实现,就是用单例+工厂模式+配置文件来指定对某个数据类型与数据库的访问实现者。
  简单的说就是说指定了实现了dao.impl的类返回一个dao接口。
  因为考虑到了以后的扩展性,用到Properties类来配置实现了dao.imp的类:
  这里先简单的介绍一下Properties类:
  1.位于的包:java.util.Properties
  2.父类java.util.Hashtable
其主要功能:
        Properties类是积聚了集合和IO的特点,能够让程序员能够很方便将存放在硬盘上的文本文件中存放的键值对导入到集合中。
        如:有以下configre.properties
                  clazzName1 = java.lang.String
                  clazzName2 = java.util.ArrayList
这样只要根据Properties中的
public void load(InputStream inStream)
          throws IOException 方法就能将文本文件中的键值对存放到集合当中了。
其实不是什么很高深的技术,自己通过IO和集合的值也可以写出这种类来,只不过这比较常用,sun公司就帮你封装好了,成为了标准。

接下来就进入主题了:这里就主要用代码加注释了
package com.wenfengkeji.dao;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class DaoFactory {
        private static DaoFactory instance = new DaoFactory();  //通过单例来实现的
        private UserDao userDao = null;   //UserDao是一个接口 抽象了对User这个对象的增删改查
        private DaoFactory(){
        }
        public static DaoFactory getInstance()  //返回一个工厂实例
        {
                return instance;
        }
        public UserDao getUserDao()   //该工厂有一个生产实现了UserDao接口类的方法
        {
                /*
                        接下来就是通过配置文件中的类名,运用简单的反射技术来生产一个UserDaoImpl实例
                */
                Properties pro = new Properties();
                InputStream is = null;
                try {
//                         is = new FileInputStream("src/daoconfigre.properties");  //获取到对配置文件操作的对应的流的两种方式
                         is = DaoFactory.class.getClassLoader().getResourceAsStream("daoconfigre.properties");//这种通过类加载器的工作路径来查找,更为灵活
                         pro.load(is);
                         String clazzName = pro.getProperty("UserDaoClass");
                         System.out.println(clazzName);
                         userDao = (UserDao) Class.forName(clazzName).newInstance(); //这里是核心代码
                } catch (FileNotFoundException e) {
                        throw new RuntimeException(e);
                } catch (IOException e) {
                        throw new RuntimeException(e);
                } catch (InstantiationException e) {
                        throw new RuntimeException(e);
                } catch (IllegalAccessException e) {
                        throw new RuntimeException(e);
                } catch (ClassNotFoundException e) {
                        throw new RuntimeException(e);
                } finally {
                        try
                        {
                                if(is != null)
                                {
                                        is.close();
                                }
                        }catch(IOException e)
                        {
                                throw new RuntimeException(e);
                        }
                }
                return userDao;  //返回
        }
}

作者: y510662669    时间: 2012-10-8 12:35
亲,使用了Hibernate之后,这些代码再也不用写了,直接在xml文件中配置即可。你这是用的静态工厂写得吧??
作者: 谭立文    时间: 2012-10-8 20:44
y510662669 发表于 2012-10-8 12:35
亲,使用了Hibernate之后,这些代码再也不用写了,直接在xml文件中配置即可。你这是用的静态工厂写得吧?? ...

嗯,还没开始学三大框架。
作者: y510662669    时间: 2012-10-8 22:11
谭立文 发表于 2012-10-8 20:44
嗯,还没开始学三大框架。

我也是还没学,自己自学了点。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2