Factory方法解决网站应用不同数据库的问题

5 篇文章 0 订阅
5 篇文章 0 订阅
      对于客户不同的需求,一个数据库网站系统应该可以配置多种数据库。比如可以选择使用Oracle或者是MySQL。运用java中的Factory方法可以解决这个问题。
      首先,只有DAO涉及到数据库的连接和操作。所以应该写可以操作Oracle的OracleDAO和MySQL的MySQLDAO两套方案。可以新建OracleDAO文件夹,里面有UserDAOOracle.java,AdminDAOOracle.java,GoodDAOOracle.java
;新建MySQLDAO文件夹,里面有UserDAOMySQL.java,AdminDAOMySQL.java,GoodDAOMySQL.java。这样,我们在实例化一个DAO的时候,比如是UserDAOMySQL。我们会这样做UserDAOMySQL dao=new UserDAOMySQL();但是当用户要求改用Oracle数据库的时候,我们就麻烦了,要把所有的实例化DAO改成对应的OracleDAO。这是一个很让人蛋疼的工作。
        所以,我们又进一步想到可不可以用Class.forName(“”)的方法,在配置文件中决定实例化的DAO是操作Oracle的还是MySQL的。所以,我们将每一个表对应的DAO路径写到.properties文件中。比如userdao="XX.YY.
MySQLDAO.UserDAOMySQL",用师兄给的一个类Config urationStaticFinal_lmodules_nodes.java,在里面配置如下代码“Public Static String userdao;userdao=CONF.findProperty("userdao");" 这样我们实例化数据库
DAO时就可以这样写   UserDAOMySQL   userdao=Class.forName ("Config u rationStaticFinal_lmodules_nodes
.userdao”)。这样又出现了一个问题,就是当配置文件中如果是MySQLDAO的话,是对的。如果是 OracleDAO的
配置路径,我们得到的就是UserDAOOracle,这样前面的定义就不对了。我们需要把MySQLDAO和OracleDAO抽象出一个接口。就是UserDAOInf.java,我们把不同表对应的接口统一写在InfDAO 的文件夹里。这样我们实例化DAO的时候就可以这么写了UserDAOInf userdao=Class.forName("ConfigurationStaticFinal_lmodules_nodes.
userdao").    So我们在更改数据库的时候,就只要把配置文件中的不同表对应的DAO路径改一下就可以了。事情到这一步我们的工作量可以说已经简化很多了,如果我们碰到上百个表的工程时,我们就要改动对应的上百个路径。下面,我们继续简化~~(用到java里的Factory方法)
        我们又想,可不可以把所有实例化的DAO全都从一个工厂里取出来?比如我们写一个
            Public Class    ZiFactory1  extends Factory{
              Public UserDAOInf newuserdao(){
                                    return new UserDAOMySQL();
                                    }
              Public AdminDAOInf newadmindao(){
                                    return new AdminDAOMySQL();
                                    }
              Public GoodDAOInf newgooddao(){
                                    return new GoodDAOMySQL();
                                    }
               }
这样我们在实例化DAO的时候就可以用这样的方法了zf.newuserdao()(zf是ZiFactory1的一个实例化对象)。同样OracleDAO文件夹下面也要对应写一个生产OracleDAO的ZiFactory()类。我们再把这个工厂类配置到那个配置(.properties)文件中.zFactory="XX.YY.MySQLDAO.ZiFactory1"
在ConfigurationStaticFinal _lmodules_nodes.java中添加相应代码{
                     Public Static String zFactory;                       
                     zFactory=CONF.finProperty("zFactory");
}
这时要实例化我们的DAO对象就可以这样来:
UserDAOInf userdao=               ( UserDAOInf)Class.forName(ConfigrationStaticFinal_lmodules_nodes.zFactory).newInstance().newuserdao();
这样便很好的解决了更改数据库的问题。只要修改配置文件中zFactory的属性就达到了更改数据库的问题。
好像问题又来了,我们每一次实例化DAO的时候都要写那么长的代码,不是很方便。我们可以进一步改写
增加一个ZiFactory的一个父类
Public Abstract Class    Factory(){
                             Public Static   Factory   getZiFactory(){
              Factory f=null;
              Try{
              f=(Factory)Class.forName(ConfigurationStaticFinal _lmodules_nodes.zFactory).newInstance();
                  }Catch(Exception e){
                     e.printStackTrace();              
                                }
                  }
         Public Abstract    UserDAOInf   newuserdao();
         Public Abstract    AdminDAOInf newadmindao();
         Public Abstract    GoodDAOInf   newgooddao();
}
这样,我们在用到DAO的时候就可以这样实例化了
        UserDAOInf      userdao=Factory.getZiFactory().newuserdao();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值