background image

·DAL  :

public class UserManager{ ...... }

这样,工厂在

程序

当中就起到装配的作用,将

 DAL 层的对象装备到 BLL 层中使用。

以上是简单工厂的模型,如果考虑

程序

的数据库需要在

 SQL Server 和 Oracle 之间切换的话,就很有可

能需要

 SQLDAL 和 OracleDAL 两套数据访问层。因为以前已经引入的接口,各种数据库无非就是不同的

实现

 IDAL 层的方式而已,对 BLL 层没有影响。如果切换数据库的话,工厂中的各个 Create 方法中需要

返回的对象,就必须改成不同的

 SQL 和 Oracle 对象。

比如:

return new SQLUserManager(); 或者 return new OracleUserManager();

切换数据库时,工厂中的所有

 DAL 对象都需要变成另外一类,数量大的情况下,修改也是相当费力,所

以,一般考虑数据库切换一个或多个的情况下,在设计工厂中

 Create 方法时,会使用:

public class DataAccess

{

private static string dbName = "SQL";

public static IUserManager CreateUserManager()

{

if(dbName == "SQL") return new SQLUserManager();

if(dbName == "Oracle") return new OracleUserManager();

}

}

通过一个字符串的判断,确定当前需要的

 DAL 对象类型,维护时,只需要修改 dbName 就可以实现切

换。

这样做的好处显而易见,但问题也同样存在。如果现在需要另一种

 Access 数据库的切换,肯定需要再加

一条:

if(dbName == "Access") return new AccessUserManager(); DAL 对象很多,需要加的就

很多,还是很麻烦。这时大家可能发现,各种数据库对应的

 UserManager() 的区别就在一个名字上,而

格式

很规范,如何根据名字动态产生对应的数据库

 DAL 对象呢?反射!