使用设计模式构建通用数据库访问类(4) 现在我们已经完成了所要的功能,下面,我们需要创建一个Factory类,来实现自动数据库切换的管理。这个类很简单,主要的功能就是根据数据库连接字符串,判断使用什么数据库,然后,返回适当的数据库操纵类。在这里,判断的方法很简单,只是根据两种数据库连接字符串的不同来判断。在实际中,随着数据库类的增加,判断的方法可能会有所变化,读者应当根据自己的实际情况来做相应的调整。 public class DBOperatorFactory { public static DBOperator GetDBOperator(string strConnection) { if(strConnection.IndexOf("provider=")<0) //SqlServer { return new SqlDBOperator(strConnection); } else //other database { return new OleDBOperator(strConnection); } } } 好了,现在,一切都完成了,客户端在代码调用的时候,可能就是采用如下形式: DBOperator db=DBOperatorFactory.GetDBOperator(strConnection) db.Open(); db.需要的操作 db.Close(); 或者: DBOperator db=DBOperatorFactory.GetDBOperator(strConnection) db.Open();db.BeginTrans(); try { db.需要的操作 db.CommitTrans(); } catch { db.RollbackTrans(); } db.Close(); 当数据库发生变化的时候,DBOperatorFactory会根据数据库连接字符串自动调用相应的类,客户端不会感觉到变化,也不用去关心。这样,实现了良好的封装性。当然,前提是,你在编写程序的时候,没有用到特定数据库的特性,例如,Sql Server的专用函数。 实际上,Factory模式也可以不使用Factory类来实现,而是让接口抽象类自己来管理,这可以称作自管理的Factory,是Factory模式的一种变形。这么做的好处,是可以免去一个Factory类,使代码更加简练。这么做,我们需要对DBOperator类做一些改变,增加一个Instance方法。这也是对DBOperator采用抽象类而不是接口的原因(接口的方法不能有实现),代码如下: public static DBOperator Instance(string strConnection) { if(strConnection.IndexOf("provider=")<0) //SqlServer { return new SqlDBOperator(strConnection); } else //other database { return new OleDBOperator(strConnection); } } 然后,客户端代码就可能是类似于下面的形式: DBOperator db= DBOperator.Instance(strConnection) db.Open(); db.需要的操作 db.Close(); 下面来看看连接池的做法,方法就是Singleton。 先看Singleton模式的经典含义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。推而广之,当我们需要精确控制类在系统中的实例的个数的时候,就可以使用Singleton模式。现在,我们需要构建一个缓冲池,保存数据库类的实例,正好是Singleton模式发挥作用的时候。