初学习设计模式的工厂方法模式,写了一个创建数据库连接的工厂,代码如下,大家讨论一下,这个写法合适不?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);
}
}
类图地址为http://blog.csdn.net/images/blog_csdn_net/vabug/20615/o_DataBaseOperation.jpg
qq设计模式讨论群:18494256
这里还要个判断数据库类型,有没更好的方法,不用判断类型,直接返回一个数据连接呢?

解决方案 »

  1.   

    还是高手如云,才开始接触.net顺路拜学!
      

  2.   

    好长好长。我一直有一个疑问:在一个dll里面有多个数据库的使用方法,那么到底是怎么判断程序需要哪个数据库呢?以前的方法是设置一个值,放在配置文件(比如web.config)里面,然后在程序里面读取,判断。那么工厂怎么实现呢?是不是不用判断了,自己就知道了。
      

  3.   

    好像只有把值放在web.config 更为好一些吧??
      

  4.   

    别重造车轮了, ADO.NET 2.0提供了这样的工厂http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/vsgenerics.asp
      

  5.   

    @ saucer(思归) 
    又见大侠身影,谢谢,ado.net2.0 没有用,我用的是ado.net 1.1@ jyk
    是要判断,工厂模式不能解决新对象的问题@smallMage
    类图是用TOGETHER画的
      

  6.   

    可以看看petshop的实现方式,从web.config 装配组件
      

  7.   

    用反射比较好点,万一要添加别的数据库就要改代码了,
    通过读取XML配置来获得1个当前要使用的类对象
      

  8.   

    可以用Spring.net实现动态装配~