当前位置:Gxlcms > 数据库问题 > C#-关于带参数的单例模式的思考(利用带参数的单例模式连接并查询数据库特定表的信息)

C#-关于带参数的单例模式的思考(利用带参数的单例模式连接并查询数据库特定表的信息)

时间:2021-07-01 10:21:17 帮助过:5人阅读

sealed class Singleton { private static Singleton instance = null; private static readonly object padlock = new object(); Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (padlock) { if (instance == null) { instance = new Singleton(); } } } return instance; } } }

这是<<C# in Depth>>这本书中提供的标准代码。

实现单例模式的思路是:

  1. 定义一个密封类(sealed)以避免其它类继承此类(据书中所说此举虽然不是必要的,但可以帮助JIT进行更多优化)。
  2. 定义并初始化该类自身的静态实例(instance)为null,用该instance来检测控制在创建单例模式的类的程序中只有一个该类的实例。
  3. 定义并初始化一个只读(readonly)的用于锁(lock)的object对象以满足多线程环境。
  4. 创建一个只有get方法的该类的静态变量,用于创建该类的实例。
  5. 最后在该类的构造函数中写入相关代码。

可以看到整个过程中并未传入参数。

考虑以下问题:

如果我用单例模式连接并查询数据库单个表的所有信息,但数据库中有很多表,我想往单例模式中传入参数怎么办?

看以下代码:

  1. <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">sealed</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Database
  2. {
  3. </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> Database _instance = <span style="color: #0000ff;">null</span><span style="color: #000000;">;
  4. </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">readonly</span> <span style="color: #0000ff;">object</span> _Object = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">object</span><span style="color: #000000;">();
  5. </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">string</span> conString = <span style="color: #800000;">"</span><span style="color: #800000;">connection string</span><span style="color: #800000;">"</span><span style="color: #000000;">;
  6. </span><span style="color: #0000ff;">private</span> Database(<span style="color: #0000ff;">string</span><span style="color: #000000;"> tableName, DataTable dt)
  7. {
  8. </span><span style="color: #0000ff;">using</span> (SqlConnection Conn = <span style="color: #0000ff;">new</span><span style="color: #000000;"> SqlConnection(conString))
  9. {
  10. Conn.Open();
  11. </span><span style="color: #0000ff;">string</span> sql = <span style="color: #800000;">"</span><span style="color: #800000;">select * from </span><span style="color: #800000;">"</span> +<span style="color: #000000;"> tableName;
  12. </span><span style="color: #0000ff;">using</span> (SqlCommand cmd = <span style="color: #0000ff;">new</span><span style="color: #000000;"> SqlCommand(sql))
  13. {
  14. </span><span style="color: #0000ff;">using</span> (SqlDataAdapter da = <span style="color: #0000ff;">new</span><span style="color: #000000;"> SqlDataAdapter())
  15. {
  16. cmd.CommandType </span>=<span style="color: #000000;"> CommandType.Text;
  17. cmd.Connection </span>=<span style="color: #000000;"> Conn;
  18. da.SelectCommand </span>=<span style="color: #000000;"> cmd;
  19. da.Fill(dt);
  20. }
  21. }
  22. }
  23. }
  24. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> Database GetInstance(<span style="color: #0000ff;">string</span><span style="color: #000000;"> tableName, DataTable dt)
  25. {
  26. </span><span style="color: #0000ff;">if</span> (_instance == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
  27. {
  28. </span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_Object)
  29. {
  30. </span><span style="color: #0000ff;">if</span> (_instance == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
  31. {
  32. _instance </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Database(tableName, dt);
  33. }
  34. }
  35. }
  36. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> _instance;
  37. }
  38. }</span>
  1. DataTable dt = <span style="color: #0000ff;">new</span><span style="color: #000000;"> DataTable();
  2. Database.GetInstance(</span><span style="color: #800000;">"</span><span style="color: #800000;">MyTable</span><span style="color: #800000;">"</span><span style="color: #000000;">,dt);
  3. Database.GetInstance(</span><span style="color: #800000;">"</span><span style="color: #800000;">MyTable2</span><span style="color: #800000;">"</span><span style="color: #000000;">, dt);
  4. dataGridView1.DataSource </span>= dt;

由于单例模式,DataGridView中将只显示‘MyTable’的信息。

问题虽然得到解决,但单例模式通常提供对该实例的简单访问,是否使用工厂模式会有更合适呢?

待续...

C#-关于带参数的单例模式的思考(利用带参数的单例模式连接并查询数据库特定表的信息)

标签:readonly   lda   ado   tco   环境   代码   open()   静态   sel   

人气教程排行