设计模式的问题,欢迎讨论

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);
}
}
...全文
398 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfhlxl 2006-04-09
  • 打赏
  • 举报
回复
mark
vabug 2006-04-09
  • 打赏
  • 举报
回复
up
vabug 2006-04-07
  • 打赏
  • 举报
回复
up
kissknife 2006-04-07
  • 打赏
  • 举报
回复
给你几个接口:
IDbConnection
IDbCommand
IDataParameter
IDataReader
IDbTransaction
IDbDataAdapter
另:
public sealed class SqlDataAdapter : DbDataAdapter, IDbDataAdapter

public sealed class SqlConnection : Component, IDbConnection

public sealed class SqlCommand : Component, IDbCommand, ICloneable

public sealed class SqlParameter : MarshalByRefObject,
IDbDataParameter, IDataParameter, ICloneable

public sealed class SqlDataReader : MarshalByRefObject,
IEnumerable, IDataReader, IDisposable, IDataRecord

public sealed class SqlTransaction : MarshalByRefObject,
IDbTransaction, IDisposable
alanzhou 2006-04-07
  • 打赏
  • 举报
回复
不好意思说了句废话
alanzhou 2006-04-07
  • 打赏
  • 举报
回复
数据库类型应该是在配置文件中配置的,而不是在代码中选折的。
否则,仍不能实现灵活切换数据库。
hyj_828 2006-01-13
  • 打赏
  • 举报
回复
public DbConnectionFactory(string strConnectionString,IConnection conn)

接口可以實現後期綁定,所以不需要判斷類型。
lidong6 2006-01-13
  • 打赏
  • 举报
回复
模式问题的楼主最好用UML来描述. 这样别人一看就明白.这么长的代码能耐心看完的没几人.
lyb_abiandbel 2006-01-09
  • 打赏
  • 举报
回复
工厂模式在petshop 3.0中也有很好的实现,在更换数据库的时候会很有用,
还是写个别的比较实在。
vabug 2006-01-03
  • 打赏
  • 举报
回复
自己up
vabug 2005-12-21
  • 打赏
  • 举报
回复
@ alanzhou(为什么)
是重复了点,呵呵,谢谢建议
@ henryfan1(http://henryfan.cnblogs.com)
这样写
public DbConnectionFactory(string strConnectionString,DataBaseType dbtype)
只是想区分数据库类型,
你说这样写
public DbConnectionFactory(string strConnectionString,IConnection conn)
那如何判断数据库类型,从传人的IConnection conn判断?
henryfan1 2005-12-20
  • 打赏
  • 举报
回复
代码没什么问题,我只想问下
public DbConnectionFactory(string strConnectionString,DataBaseType dbtype)
为什么不?
public DbConnectionFactory(string strConnectionString,IConnection conn)
既然IConnection 已经可以直接获取IDBConnection那写这个方法是不是有点那个...

有兴趣可以看下NHibernate Drivers目录的文件码.
alanzhou 2005-12-20
  • 打赏
  • 举报
回复
代码重复
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();
givenchy 2005-12-20
  • 打赏
  • 举报
回复
哈哈,你写的数据库类型枚举正是结构化编程的写法,正是工厂模式要反对的。
vabug 2005-12-19
  • 打赏
  • 举报
回复
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看过,很复杂,学习嘛,只是想体会一下设计模式的好处
chinawn 2005-12-18
  • 打赏
  • 举报
回复
好长
wormwormwormworm 2005-12-18
  • 打赏
  • 举报
回复
不懂,帮顶
zeusvenus 2005-12-18
  • 打赏
  • 举报
回复
类图没问题,代码大致看了下也没问题。
但个人觉得关于数据连接的工厂模式实现意义不是很大,有现成的经过实践检验的Enterprise Library。
jxufewbt 2005-12-18
  • 打赏
  • 举报
回复
http://zhenyulu.cnblogs.com/category/6930.html?Show=All
Proyang 2005-12-18
  • 打赏
  • 举报
回复
哇.好长...UP
加载更多回复(1)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧