初学习设计模式的工厂方法模式,写了一个创建数据库连接的工厂,代码如下,大家讨论一下,这个写法合适不? public enum DataBaseType
{
Oracle,
SqlServer,
Access,
}
public abstract class ConnectionCreator
{
public abstract IConnection factoryMethod(string strConnectionString)
; }
public interface IConnection
{
System.Data.IDbConnection GetConnection();
}
public class DbConnectionFactory
{
private string _ConnectionString;
private DataBaseType _dbtype;
private IConnection _iconn; public DbConnectionFactory(string strConnectionString,DataBaseType dbtype)
{
_ConnectionString=strConnectionString;
_dbtype=dbtype;
} public System.Data.IDbConnection GetConnection()
{
if(_dbtype==DataBaseType.SqlServer)
{
SqlServerCreator sql=new SqlServerCreator();
_iconn=sql.factoryMethod(_ConnectionString);
return _iconn.GetConnection();
}
if(_dbtype==DataBaseType.Oracle)
{
OracelCreator oracle =new OracelCreator();
_iconn=oracle.factoryMethod(_ConnectionString);
return _iconn.GetConnection();
}
if(_dbtype==DataBaseType.Access)
{
return null;
}
return null;
}
}
public class OracelCreator: ConnectionCreator
{
public OracelCreator()
{ }
public override IConnection factoryMethod(string strConnectionString)
{
// TODO: 添加 OracelCreator.factoryMethod 实现
return new OracleConnection(strConnectionString);
}
}
public class OracleConnection: IConnection
{
private string _strConnectionString;
private System.Data.OracleClient.OracleConnection _con; public OracleConnection(string strConnectionString)
{ _strConnectionString=strConnectionString; }
//---------------------------------------------------------------------------------------------
#region OracleConnection 成员
public System.Data.IDbConnection GetConnection()
{
// TODO: 添加 OracleConnection.GetConnection 实现
System.Data.IDbConnection iConn;
_con=new System.Data.OracleClient.OracleConnection();
_con.ConnectionString=_strConnectionString;
try
{
_con.Open();
}
catch(System.Exception err)
{
throw new System.Exception("DataBaseOperation Error:"+err.Message);
}
finally
{
if(_con.State==System.Data.ConnectionState.Open)
iConn= _con;
else
{
_con.Dispose();
iConn=null;
}
}
return iConn;
}
/// <summary>
/// 连接字符串
/// </summary>
public string ConnectionString
{
set
{
_strConnectionString=value;
}
get
{
return _strConnectionString;
}
}
#endregion }
public class SqlServerConnection: IConnection
{
private string _strConnectionString;
private System.Data.SqlClient.SqlConnection _con; public SqlServerConnection(string strConnectionString)
{
_strConnectionString=strConnectionString; //
// TODO: Add constructor logic here
//
}
//------------------------------------------------------------------------------------------------- #region SqlServerConnection 成员 public System.Data.IDbConnection GetConnection()
{
// TODO: 添加 SqlServerConnection.GetConnection 实现
System.Data.IDbConnection iConn;
_con=new System.Data.SqlClient.SqlConnection();
_con.ConnectionString=_strConnectionString;
try
{
_con.Open();
}
catch(System.Exception err)
{
throw new System.Exception("DataBaseOperation Error:"+err.Message);
}
finally
{
if(_con.State==System.Data.ConnectionState.Open)
iConn= _con;
else
{
_con.Dispose();
iConn=null;
}
}
return iConn;
} /// <summary>
/// 连接字符串
/// </summary>
public string ConnectionString
{
set
{
_strConnectionString=value;
}
get
{
return _strConnectionString;
}
} #endregion
}
public class SqlServerCreator: ConnectionCreator
{
public SqlServerCreator()
{ }
public override IConnection factoryMethod(string strConnectionString)
{
return new SqlServerConnection(strConnectionString);
}
}
{
Oracle,
SqlServer,
Access,
}
public abstract class ConnectionCreator
{
public abstract IConnection factoryMethod(string strConnectionString)
; }
public interface IConnection
{
System.Data.IDbConnection GetConnection();
}
public class DbConnectionFactory
{
private string _ConnectionString;
private DataBaseType _dbtype;
private IConnection _iconn; public DbConnectionFactory(string strConnectionString,DataBaseType dbtype)
{
_ConnectionString=strConnectionString;
_dbtype=dbtype;
} public System.Data.IDbConnection GetConnection()
{
if(_dbtype==DataBaseType.SqlServer)
{
SqlServerCreator sql=new SqlServerCreator();
_iconn=sql.factoryMethod(_ConnectionString);
return _iconn.GetConnection();
}
if(_dbtype==DataBaseType.Oracle)
{
OracelCreator oracle =new OracelCreator();
_iconn=oracle.factoryMethod(_ConnectionString);
return _iconn.GetConnection();
}
if(_dbtype==DataBaseType.Access)
{
return null;
}
return null;
}
}
public class OracelCreator: ConnectionCreator
{
public OracelCreator()
{ }
public override IConnection factoryMethod(string strConnectionString)
{
// TODO: 添加 OracelCreator.factoryMethod 实现
return new OracleConnection(strConnectionString);
}
}
public class OracleConnection: IConnection
{
private string _strConnectionString;
private System.Data.OracleClient.OracleConnection _con; public OracleConnection(string strConnectionString)
{ _strConnectionString=strConnectionString; }
//---------------------------------------------------------------------------------------------
#region OracleConnection 成员
public System.Data.IDbConnection GetConnection()
{
// TODO: 添加 OracleConnection.GetConnection 实现
System.Data.IDbConnection iConn;
_con=new System.Data.OracleClient.OracleConnection();
_con.ConnectionString=_strConnectionString;
try
{
_con.Open();
}
catch(System.Exception err)
{
throw new System.Exception("DataBaseOperation Error:"+err.Message);
}
finally
{
if(_con.State==System.Data.ConnectionState.Open)
iConn= _con;
else
{
_con.Dispose();
iConn=null;
}
}
return iConn;
}
/// <summary>
/// 连接字符串
/// </summary>
public string ConnectionString
{
set
{
_strConnectionString=value;
}
get
{
return _strConnectionString;
}
}
#endregion }
public class SqlServerConnection: IConnection
{
private string _strConnectionString;
private System.Data.SqlClient.SqlConnection _con; public SqlServerConnection(string strConnectionString)
{
_strConnectionString=strConnectionString; //
// TODO: Add constructor logic here
//
}
//------------------------------------------------------------------------------------------------- #region SqlServerConnection 成员 public System.Data.IDbConnection GetConnection()
{
// TODO: 添加 SqlServerConnection.GetConnection 实现
System.Data.IDbConnection iConn;
_con=new System.Data.SqlClient.SqlConnection();
_con.ConnectionString=_strConnectionString;
try
{
_con.Open();
}
catch(System.Exception err)
{
throw new System.Exception("DataBaseOperation Error:"+err.Message);
}
finally
{
if(_con.State==System.Data.ConnectionState.Open)
iConn= _con;
else
{
_con.Dispose();
iConn=null;
}
}
return iConn;
} /// <summary>
/// 连接字符串
/// </summary>
public string ConnectionString
{
set
{
_strConnectionString=value;
}
get
{
return _strConnectionString;
}
} #endregion
}
public class SqlServerCreator: ConnectionCreator
{
public SqlServerCreator()
{ }
public override IConnection factoryMethod(string strConnectionString)
{
return new SqlServerConnection(strConnectionString);
}
}
qq设计模式讨论群:18494256
但个人觉得关于数据连接的工厂模式实现意义不是很大,有现成的经过实践检验的Enterprise Library。
{
SqlServerCreator sql=new SqlServerCreator();
_iconn=sql.factoryMethod(_ConnectionString);
return _iconn.GetConnection();}
if(_dbtype==DataBaseType.Oracle)
{
OracelCreator oracle =new OracelCreator();
_iconn=oracle.factoryMethod(_ConnectionString);
return _iconn.GetConnection();
}
if(_dbtype==DataBaseType.Access)
{
return null;
}
这里还要个判断数据库类型,有没更好的方法,不用判断类型,直接返回一个数据连接呢?
@ zeusvenus(清柳)
Enterprise library看过,很复杂,学习嘛,只是想体会一下设计模式的好处
if(_dbtype==DataBaseType.SqlServer)
{
SqlServerCreator sql=new SqlServerCreator();
_iconn=sql.factoryMethod(_ConnectionString);
return _iconn.GetConnection();}
if(_dbtype==DataBaseType.Oracle)
{
OracelCreator oracle =new OracelCreator();
_iconn=oracle.factoryMethod(_ConnectionString);
return _iconn.GetConnection();
}
=========================if(_dbtype==DataBaseType.SqlServer)
{
ConnectionCreator conner=new SqlServerCreator();}
if(_dbtype==DataBaseType.Oracle)
{
ConnectionCreator conner =new OracelCreator();}
_iconn=conner.factoryMethod(_ConnectionString);
return _iconn.GetConnection();
public DbConnectionFactory(string strConnectionString,DataBaseType dbtype)
为什么不?
public DbConnectionFactory(string strConnectionString,IConnection conn)
既然IConnection 已经可以直接获取IDBConnection那写这个方法是不是有点那个...有兴趣可以看下NHibernate Drivers目录的文件码.
是重复了点,呵呵,谢谢建议
@ henryfan1(http://henryfan.cnblogs.com)
这样写
public DbConnectionFactory(string strConnectionString,DataBaseType dbtype)
只是想区分数据库类型,
你说这样写
public DbConnectionFactory(string strConnectionString,IConnection conn)
那如何判断数据库类型,从传人的IConnection conn判断?
还是写个别的比较实在。
IDbConnection
IDbCommand
IDataParameter
IDataReader
IDbTransaction
IDbDataAdapter
另:
public sealed class SqlDataAdapter : DbDataAdapter, IDbDataAdapterpublic sealed class SqlConnection : Component, IDbConnectionpublic sealed class SqlCommand : Component, IDbCommand, ICloneablepublic sealed class SqlParameter : MarshalByRefObject,
IDbDataParameter, IDataParameter, ICloneablepublic sealed class SqlDataReader : MarshalByRefObject,
IEnumerable, IDataReader, IDisposable, IDataRecordpublic sealed class SqlTransaction : MarshalByRefObject,
IDbTransaction, IDisposable