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

解决方案 »

  1.   

    类图地址为http://blog.csdn.net/images/blog_csdn_net/vabug/20615/o_DataBaseOperation.jpg
    qq设计模式讨论群:18494256
      

  2.   

    http://zhenyulu.cnblogs.com/category/6930.html?Show=All
      

  3.   

    类图没问题,代码大致看了下也没问题。
    但个人觉得关于数据连接的工厂模式实现意义不是很大,有现成的经过实践检验的Enterprise Library。
      

  4.   

    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;
    }
    这里还要个判断数据库类型,有没更好的方法,不用判断类型,直接返回一个数据连接呢?
    @ zeusvenus(清柳)
    Enterprise library看过,很复杂,学习嘛,只是想体会一下设计模式的好处
      

  5.   

    代码重复
    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();
      

  6.   

    代码没什么问题,我只想问下
    public DbConnectionFactory(string strConnectionString,DataBaseType dbtype)
    为什么不?
    public DbConnectionFactory(string strConnectionString,IConnection conn)
    既然IConnection 已经可以直接获取IDBConnection那写这个方法是不是有点那个...有兴趣可以看下NHibernate Drivers目录的文件码.
      

  7.   

    @ alanzhou(为什么) 
    是重复了点,呵呵,谢谢建议
    @ henryfan1(http://henryfan.cnblogs.com) 
    这样写
    public DbConnectionFactory(string strConnectionString,DataBaseType dbtype)
    只是想区分数据库类型,
    你说这样写
    public DbConnectionFactory(string strConnectionString,IConnection conn)
    那如何判断数据库类型,从传人的IConnection conn判断?
      

  8.   

    工厂模式在petshop 3.0中也有很好的实现,在更换数据库的时候会很有用,
    还是写个别的比较实在。
      

  9.   

    模式问题的楼主最好用UML来描述. 这样别人一看就明白.这么长的代码能耐心看完的没几人.
      

  10.   

    public DbConnectionFactory(string strConnectionString,IConnection conn)接口可以實現後期綁定,所以不需要判斷類型。
      

  11.   

    给你几个接口:
    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