最近再在做一套CMS,发现有组员对抽象工厂这一开发模式概念不清晰,应他们要求,这里我就简要说明下各层之间的关系,对抽象工厂模式有不明白的朋友可以看看,说的不对之处还请指出:
所谓的三层开发,无外乎:
数据访问层、业务逻辑层和显示层;
至于模型层(穿插3层,不在其中,若真要算,可以认为是数据访问层,但实质上是位于数据库和数据访问层之间);
而抽象工厂模式是在三层开发的基础上增加了一个工厂层和接口层,像我现在的项目就是这么几个类库:实体类库,接口类库,数据访问层类库,工厂类库,业务逻辑层类库和显示层,至于数据库类,可以认为是Linq或者是在一个工具类库中。
抽象工厂最大的一个作用就是可以方便实现数据库的切换(通过工厂)
那么,整理下(以我近期Cms的项目为例):
1.实体类库CmsModels
2.接口类库ICmsDal
3.数据访问层类库CmsDal(CmsDal指不同数据库的访问层,比如AccessDal,MSSQLDal,OracleDal)
4.工厂类库CmsFactory
5.业务逻辑层类库CmsBll
6.显示层webSite
7.工具类库或Linq等
它们的关系依次为:
CmsDal继承ICmsDal,实现里面的方法,其中ICmsDal的对象在工厂中要派上用场;
CmsFactory根据配置文件中的参数来选择使用的数据库,生成相对应的实例;
CmsBll,通过CmsFactory中生成的数据访问层对象来调用CmsDal中相对应的“类”;
webSite,通过CmsBll中的方法来调用数据访问层中的方法(说白了就是查询数据库获得结果集)。
PS:举个例子
如果实体类中有8个实体类,那么就会有对应的8个接口类,对应的8个数据访问层类,对应的8个工厂类,对应的8个业务逻辑层中的类,而他们之间的关系大致如下:
假设有Article实体类-->那么就有IArticleDal接口-->就有与之相对应的ArticleDal-->有与之相对应的ArticleFactory
-->有与之相对应的ArticleBll,资源管理器中大致如下:
这里的AccessDal和MSSQLDal即我上面所说的CmsDal;
工厂的作用就是生成实例,例子如下:
工厂层要事先引入System.Web,因为这里我是通过配置文件获取数据库的选择(到底是SQL
SERVER还是ACCESS)
业务逻辑层中:
显示层不用管工厂的东西,只要调用bll层的方法即可,在上面的代码中调用的GetString()方法,在AccessDal和MSSQLDal中的ArticleDal类内都有这么个方法,如下:
显示层中的web.config代码:
测试代码:
当在配置文件中value设为1时,页面将显示“这里是SQL SERVER”,而设置为2时,将显示“这里是 ACCESS”
以上
附上这次的说明用解决方案:(vs2010中编译通过)
http://www.kuaipan.cn/file/id_17032848158498515.htm