设计模式的问题,欢迎讨论
vabug 2005-12-18 09:55:22 初学习设计模式的工厂方法模式,写了一个创建数据库连接的工厂,代码如下,大家讨论一下,这个写法合适不?
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);
}
}