一:
首先要知道一个思想系统会根据用户使用不同的数据库而使用相对应的数据库访问层,这里面两个思想:
一个是反射的思想,当用户使用某种数据库的时候再配置文件中的path就设置为这种数据库的数据库访问层的路径,这样就实例化了该用户要使用的数据库访问层类,然后这里又有一个问题就是,当用户实例化了某种数据库的数据库访问层类的时候,在逻辑层的时候,可能在调用数据访问层中的“获取信息”的这个方法的时候,oracal数据库用的是GetInfoByOracal,而在sql中是GetInfoBySql,所以这两个方法不一样,那么在切换两个数据库的时候就要修改逻辑层中的代码,这是不允许的,那么为了统一数据访问层中的这个获取信息的方法,我们定义一个接口,让每个数据库的数据访问层都继承这个接口,这样在每个数据库访问层的获取信息的方法都有相同的签名,这样在切换数据库的时候就不用修改逻辑层中国的任何代码了,这是用接口的一个好处,接口的另一个好处就是,当用反射实例化一种类型的数据库的数据库访问层的对象的时候,把这个接口指向这个对象,使之成为一个接口引用对象,这样这个接口对象中的方法就为这种类型数据库的数据库访问层的类中的我方法,我们在反射实例化一个对象之后马上对他进行接口对象引用,然后返回这个接口对象引用。(因为在数据库类型工厂中要用到接口,所以这个工厂要引用接口的命名空间,又由于不同的数据库的数据库访问层都要继承这个接口所以,不同的数据库访问层也要引用这个接口的命名空间,综上,就要定义一个接口,这个接口中的方法的定义完全是由系统要在数据访问层中设置的功能来决定的,而数据访问层中的每个方法返回的是什么就是什么,可以是实体对象,可以是泛型等等,但是绝对不是接口类型的对象引用)
二:
上面返回的这个接口对象引用就在逻辑层中起作用,作用是调用这时候的数据访问层中的方法,
三:
接口在petshop中涉及的范围:(1)首先是数据访问层的类,每个数据库访问层的类都要继承这个接口,并且要实现这个接口中的方法,(2)是在数据库类型工厂中要把刚用反射实例化的对象指向为接口的引用对象,。且返回这个接口引用对象(3)在逻辑层中要得到一个数据访问层的类,这样才能和数据库访问层沟通,于是就说接收数据库类型返回的这个接口引用对象。然后通过这个引用对象来对数据访问层进行反问。
四:
对于Model层该干什么就还是干什么,而对于数据库访问层也是该干什么就干什么,不同的是继承了接口,所以一定要实现接口中的方法而已,而其中方法的返回值该是什么就还是什么
五:
由以上可以得到要有几个模块:model,bll,dal,idal,Iitem
六:
可能这个系统的所以对接口的定义都是由于这个系统要考虑可能存在不同的数据库,也正是由于有了不同的数据库的支持才有了什么工厂类等,
七:
记住一个数据库访问层类是一个总类,是不可能实例化的,因为他里面包含了很多的子类,即每个实体对应的数据库访问层类,最后实例化的才是这个具体的类,而不的SQlDAL或者oracalDal这个总类,于是才有了抽象工厂的说法,于是在实例化每个类时,是要用反射实例化每个具体的子类了,有Order,Product,Category,Inventory,Item
八:
其实也不是真正的抽象工厂模式,是一种依赖配置文件+反射+接口(或许说的面向接口设计),我们定义一个数据访问层工厂类,这个类里面包含了每个实体所对应的数据库访问层类的实例化方法。他们都是静态的,你只要提供你要实例化的那个实体对应的那个数据库访问层类的名称即可,通过反射就能得到