时间:2021-07-01 10:21:17 帮助过:5人阅读
这是<<C# in Depth>>这本书中提供的标准代码。
实现单例模式的思路是:
可以看到整个过程中并未传入参数。
考虑以下问题:
如果我用单例模式连接并查询数据库单个表的所有信息,但数据库中有很多表,我想往单例模式中传入参数怎么办?
看以下代码:
- <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">sealed</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Database
- {
- </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;">;
- </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;">();
- </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;">;
- </span><span style="color: #0000ff;">private</span> Database(<span style="color: #0000ff;">string</span><span style="color: #000000;"> tableName, DataTable dt)
- {
- </span><span style="color: #0000ff;">using</span> (SqlConnection Conn = <span style="color: #0000ff;">new</span><span style="color: #000000;"> SqlConnection(conString))
- {
- Conn.Open();
- </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;
- </span><span style="color: #0000ff;">using</span> (SqlCommand cmd = <span style="color: #0000ff;">new</span><span style="color: #000000;"> SqlCommand(sql))
- {
- </span><span style="color: #0000ff;">using</span> (SqlDataAdapter da = <span style="color: #0000ff;">new</span><span style="color: #000000;"> SqlDataAdapter())
- {
- cmd.CommandType </span>=<span style="color: #000000;"> CommandType.Text;
- cmd.Connection </span>=<span style="color: #000000;"> Conn;
- da.SelectCommand </span>=<span style="color: #000000;"> cmd;
- da.Fill(dt);
- }
- }
- }
- }
- </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)
- {
- </span><span style="color: #0000ff;">if</span> (_instance == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
- {
- </span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_Object)
- {
- </span><span style="color: #0000ff;">if</span> (_instance == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
- {
- _instance </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Database(tableName, dt);
- }
- }
- }
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> _instance;
- }
- }</span>
- DataTable dt = <span style="color: #0000ff;">new</span><span style="color: #000000;"> DataTable();
- Database.GetInstance(</span><span style="color: #800000;">"</span><span style="color: #800000;">MyTable</span><span style="color: #800000;">"</span><span style="color: #000000;">,dt);
- Database.GetInstance(</span><span style="color: #800000;">"</span><span style="color: #800000;">MyTable2</span><span style="color: #800000;">"</span><span style="color: #000000;">, dt);
- dataGridView1.DataSource </span>= dt;
由于单例模式,DataGridView中将只显示‘MyTable’的信息。
问题虽然得到解决,但单例模式通常提供对该实例的简单访问,是否使用工厂模式会有更合适呢?
待续...
C#-关于带参数的单例模式的思考(利用带参数的单例模式连接并查询数据库特定表的信息)
标签:readonly lda ado tco 环境 代码 open() 静态 sel