网上搜索下,有很多关于数据库工厂模式的资料,在这边提供个人对数据库工厂模式的理解,我认为的数据库工厂是这样的:把对数据库的操作组件交给工厂去做,而调用方不必知道需要调用什么组件来操作特定的数据库。比如:IDbConnection (数据库连接对象)、IDbCommand (Command对象)、IDbDataAdapter( 数据适配器对象)、IDbTransaction (数据库事物对象)、IDataReader (数据阅读器对象)等等,这些操作可以在IDBFactory(数据库工厂接口)中定义,那么我们定义MSSqlDbFactory (mssql工厂类)、OdbcFactory(odbc工厂类)、OledbFactory (oledb工厂类)等等,就可以继承IDBFactory(数据库工厂接口),通过数据库工厂类来实现对不同数据库的操作,由于接口具有约束作用即:继承IDBFactory(数据库工厂接口)的类都必须全部实现IDBFactory(数据库工厂接口)中定义的全部方法,所以我们可以通过IDBFactory(数据库工厂接口)实例化数据库工厂类来调用接口中的方法,而不必关心接口的具体实现,来达到数据库工厂操作的目的。
以上为大概的现实思路,如有更好的现实思路或者有不对的地方可以大家一起讨论研究下,谢谢!
二、数据库工厂的代码实现
第一点介绍了数据库工厂模式的实现思路,接下来我们贴上代码来实现上述内容。
IDbFactory 接口
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; namespace DataBase { public interface IDBFactory { /// <summary> /// 数据库连接字符串 /// </summary> string ConnStr { get; set; } /// <summary> /// <span style="font-family: Arial, Helvetica, sans-serif;">建立Connection对象</span> /// </summary> /// <returns>Connection对象</returns> IDbConnection CreateConnection(); /// <summary> /// 根据连接字符串建立Connection对象 /// </summary> /// <param name="strConn">连接字符串</param> /// <returns>Connection对象</returns> IDbConnection CreateConnection(string strConn); /// <summary> /// 建立Command对象 /// </summary> /// <returns>Command对象</returns> IDbCommand CreateCommand(); /// <summary> /// 建立DataAdapter对象 /// </summary> /// <returns>DataAdapter对象</returns> IDbDataAdapter CreateDataAdapter(); /// <summary> /// 根据Connection建立Transaction /// </summary> /// <param name="myConn">Connection对象</param> /// <returns>Transaction对象</returns> IDbTransaction CreateTransaction(IDbConnection myConn); /// <summary> /// 根据Command对象建立DataReader /// </summary> /// <param name="myComm">Command对象</param> /// <returns>DataReader对象</returns> IDataReader CreateDataReader(IDbCommand myComm); }
MSSqlDbFactory 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; namespace DataBase { public class MSSqlDbFactory : IDBFactory { public string ConnStr { get; set; } public IDbConnection CreateConnection() { return new SqlConnection(ConnStr); } public IDbConnection CreateConnection(string strConn) { return new SqlConnection(strConn); } public IDbCommand CreateCommand() { return new SqlCommand(); } public IDbDataAdapter CreateDataAdapter() { return new SqlDataAdapter(); } public IDbTransaction CreateTransaction(IDbConnection myConn) { return myConn.BeginTransaction(); } public IDataReader CreateDataReader(IDbCommand myComm) { return myComm.ExecuteReader(); } } }OdbcFactory 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Odbc; using System.Data; namespace DataBase { public class OdbcFactory : IDBFactory { public string ConnStr { get; set; } public IDbCommand CreateCommand() { return new OdbcCommand(); } public IDbConnection CreateConnection() { return new OdbcConnection(ConnStr); } public IDbConnection CreateConnection(string strConn) { return new OdbcConnection(strConn); } public IDbDataAdapter CreateDataAdapter() { return new OdbcDataAdapter(); } public IDataReader CreateDataReader(IDbCommand myComm) { return myComm.ExecuteReader(); } public IDbTransaction CreateTransaction(IDbConnection myConn) { return myConn.BeginTransaction(); } } }OledbFactory 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.OleDb; using System.Data; namespace DataBase { public class OledbFactory : IDBFactory { public string ConnStr { get; set; } public IDbCommand CreateCommand() { return new OleDbCommand(); } public IDbConnection CreateConnection() { return new OleDbConnection(ConnStr); } public IDbConnection CreateConnection(string strConn) { return new OleDbConnection(strConn); } public IDbDataAdapter CreateDataAdapter() { return new OleDbDataAdapter(); } public IDataReader CreateDataReader(IDbCommand myComm) { return myComm.ExecuteReader(); } public IDbTransaction CreateTransaction(IDbConnection myConn) { return myConn.BeginTransaction(); } } }DbFactory 数据库工厂类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DataBase; using System.Data; namespace DataLogicLayer { public class DbFactory { //数据库工厂接口 IDBFactory dbF; /// <summary> /// 数据库工厂构造函数 /// </summary> /// <param name="dbtype">数据库枚举</param> public DbFactory(Connection.DbType dbtype) { switch (dbtype) { case Connection.DbType.MSSQLSERVER: dbF = new MSSqlDbFactory(); dbF.ConnStr = Connection.SQLConnStr(); break; case Connection.DbType.ODBC: dbF = new OdbcFactory(); dbF.ConnStr = Connection.ODBCConnStr(); break; case Connection.DbType.OLEDB: dbF = new OledbFactory(); dbF.ConnStr = Connection.OledbConnStr(); break; } } public DataTable TestQuery() { IDbConnection conn = dbF.CreateConnection(); IDbCommand comm = dbF.CreateCommand(); comm.CommandText = "select * from Operators"; comm.Connection = conn; IDbDataAdapter da = dbF.CreateDataAdapter(); da.SelectCommand = comm; DataSet ds = new DataSet(); da.Fill(ds); DataTable dt = new DataTable(); dt = ds.Tables[0]; return dt; } } }定义数据库类型枚举
//数据库类型枚举 public enum DbType { MSSQLSERVER = 0, ODBC = 1, OLEDB = 2 }通过以上代码可见,在TestQuery() 方法中直接调用接口的实现来访问数据库,而不必知道接口的具体实现是怎样的。
如果您也喜欢它,动动您的小指点个赞吧