`
qzriso
  • 浏览: 242641 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

设计模式之抽象工厂模式(二)

阅读更多

 七、.NET 2.0中的抽象工厂模式

  .NET 2.0相比.NET 1.1有很大的改进,就在ADO.NET上来说吧,提供了一套新的操作接口。下面我就简单的介绍下这套接口的设计,在System.Date下提供了 IDbConnection 、IDbCommand、IDbDataAdapter以及IDbTransaction这样一系列接口,通过ProviderFactory来完成具体 实现对象的创建,这里就是抽象工厂模式的一个应用。示意性代码:

1public IDbConnection CreateConnection()
2{
3  IDbConnection conn = null;
4  try
5  {
6    conn = (IDbConnection)Activator.CreateInstance(_connectionTypes[(int)_provider]);
7  }
8  catch(TargetInvocationException e)
9  {
10    throw new Exception(e.Message);
11  }
12  return conn;
13}
14
15public IDbConnection CreateConnection(string connectionString)
16{
17  IDbConnection conn = null;
18  object[] param ={ connectionString };
19  try
20  {
21    conn = (IDbConnection)Activator.CreateInstance(_connectionTypes[(int)_provider], param);
22  }
23  catch (TargetInvocationException e)
24  {
25    throw new Exception(e.Message);
26  }
27  return conn;
28}

  在_connectionTypes数组里存放的是IDbConnection接口的具体实现类型,如下:

  private static Type[] _connectionTypes = new Type[] { typeof(OleDbConnection), typeof(SqlConnection) };

  由于Command,DataAdapter等对象的代码都和上面很相似,这里就不作过多解释,我把代码贴到下面,有兴趣的看看:

ProviderFactory

 1using System;
 2using System.Data;
 3using System.Configuration;
 4using System.Web;
 5using System.Web.Security;
 6using System.Web.UI;
 7using System.Web.UI.WebControls;
 8using System.Web.UI.WebControls.WebParts;
 9using System.Web.UI.HtmlControls;
10using System.Reflection;
11using System.Data.OleDb;
12using System.Data.SqlClient;
13
14/**//// <summary>
15/// ProviderFactory 的摘要说明
16/// </summary>
17public class ProviderFactory
18{
19  /**//// <summary>
20  /// 私有构造器,伪单例。
21  /// 一个具体的工厂通常是一个单件(Singleton)。
22  /// </summary>
23  private ProviderFactory()
24  {
25
26  }
27
28  public ProviderFactory(ProviderType provider)
29  {
30    _provider = provider;
31  }
32
33  private static Type[] _connectionTypes = new Type[] { typeof(OleDbConnection), typeof(SqlConnection) };
34  private static Type[] _commandTypes = new Type[] { typeof(OleDbCommand), typeof(SqlCommand) };
35  private static Type[] _dataAdapterTypes = new Type[] { typeof(OleDbDataAdapter), typeof(SqlDataAdapter) };
36  private static Type[] _dataParameterTypes = new Type[] { typeof(OleDbParameter), typeof(SqlParameter) };
37  
38  private ProviderType _provider;
39  public ProviderType Provider
40  {
41    get { return _provider; }
42    set { _provider = value; }
43  }
44
45  public IDbConnection CreateConnection()
46  {
47    IDbConnection conn = null;
48    try
49    {
50      conn = (IDbConnection)Activator.CreateInstance(_connectionTypes[(int)_provider]);
51    }
52    catch(TargetInvocationException e)
53    {
54      throw new Exception(e.Message);
55    }
56    return conn;
57  }
58
59  public IDbConnection CreateConnection(string connectionString)
60  {
61    IDbConnection conn = null;
62    object[] param ={ connectionString };
63    try
64    {
65      conn = (IDbConnection)Activator.CreateInstance(_connectionTypes[(int)_provider], param);
66    }
67    catch (TargetInvocationException e)
68    {
69      throw new Exception(e.Message);
70    }
71    return conn;
72  }
73
74  public IDbCommand CreateCommand()
75  {
76    IDbCommand cmd = null;
77    try
78    {
79      cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider]);
80    }
81    catch (TargetInvocationException e)
82    {
83      throw new Exception(e.Message);
84    }
85    return cmd;
86  }
87
88  public IDbCommand CreateCommand(string cmdText)
89  {
90    IDbCommand cmd = null;
91    object[] args = { cmdText };
92    try
93    {
94      cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider], args);
95    }
96    catch (TargetInvocationException e)
97    {
98      throw new Exception(e.Message);
99    }
100    return cmd;
101  }
102
103  public IDbCommand CreateCommand(string cmdText, IDbConnection connection)
104  {
105    IDbCommand cmd = null;
106    object[] args = { cmdText, connection };
107    try
108    {
109      cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider], args);
110    }
111    catch (TargetInvocationException e)
112    {
113      throw new Exception(e.Message);
114    }
115    return cmd;
116  }
117
118  public IDbCommand CreateCommand(string cmdText, IDbConnection connection, IDbTransaction transaction)
119  {
120    IDbCommand cmd = null;
121    object[] args = { cmdText, connection, transaction };
122    try
123    {
124      cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider], args);
125    }
126    catch (TargetInvocationException e)
127    {
128      throw new Exception(e.Message);
129    }
130    return cmd;
131  }
132
133  public IDbDataAdapter CreateDataAdapter()
134  {
135    IDbDataAdapter da = null;
136    try
137    {
138      da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider]);
139    }
140    catch (TargetInvocationException e)
141    {
142      throw new SystemException(e.InnerException.Message, e.InnerException);
143    }
144    return da;
145  }
146
147  public IDbDataAdapter CreateDataAdapter(IDbCommand selectCommand)
148  {
149    IDbDataAdapter da = null;
150    object[] args = { selectCommand };
151    try
152    {
153      da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider], args);
154    }
155    catch (TargetInvocationException e)
156    {
157      throw new SystemException(e.InnerException.Message, e.InnerException);
158    }
159    return da;
160  }
161
162  public IDbDataAdapter CreateDataAdapter(string selectCommandText, IDbConnection selectConnection)
163  {
164    IDbDataAdapter da = null;
165    object[] args = { selectCommandText, selectConnection };
166    try
167    {
168      da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider], args);
169    }
170    catch (TargetInvocationException e)
171    {
172      throw new SystemException(e.InnerException.Message, e.InnerException);
173    }
174    return da;
175  }
176
177  public IDbDataAdapter CreateDataAdapter(string selectCommandText, string selectConnectionString)
178  {
179    IDbDataAdapter da = null;
180    object[] args = { selectCommandText, selectConnectionString };
181    try
182    {
183      da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider], args);
184    }
185    catch (TargetInvocationException e)
186    {
187      throw new SystemException(e.InnerException.Message, e.InnerException);
188    }
189    return da;
190  }
191
192  public IDbDataParameter CreateDataParameter()
193  {
194    IDbDataParameter param = null;
195    try
196    {
197      param = (IDbDataParameter)Activator.CreateInstance(_dataParameterTypes[(int)_provider]);
198    }
199    catch (TargetInvocationException e)
200    {
201      throw new SystemException(e.InnerException.Message, e.InnerException);
202    }
203    return param;
204  }
205
206  public IDbDataParameter CreateDataParameter(string parameterName, object value)
207  {
208    IDbDataParameter param = null;
209    object[] args = { parameterName, value };
210    try
211    {
212      param = (IDbDataParameter)Activator.CreateInstance(_dataParameterTypes[(int)_provider], args);
213    }
214    catch (TargetInvocationException e)
215    {
216      throw new SystemException(e.InnerException.Message, e.InnerException);
217    }
218    return param;
219  }
220
221  public IDbDataParameter CreateDataParameter(string parameterName, DbType dataType)
222  {
223    IDbDataParameter param = CreateDataParameter();
224    if (param != null)
225    {
226      param.ParameterName = parameterName;
227      param.DbType = dataType;
228    }
229    return param;
230  }
231
232  public IDbDataParameter CreateDataParameter(string parameterName, DbType dataType, int size)
233  {
234    IDbDataParameter param = CreateDataParameter();
235    if (param != null)
236    {
237      param.ParameterName = parameterName;
238      param.DbType = dataType;
239      param.Size = size;
240    }
241    return param;
242  }
243
244  public IDbDataParameter CreateDataParameter(string parameterName, DbType dataType, int size, string sourceColumn)
245  {
246    IDbDataParameter param = CreateDataParameter();
247    if (param != null)
248    {
249      param.ParameterName = parameterName;
250      param.DbType = dataType;
251      param.Size = size;
252      param.SourceColumn = sourceColumn;
253    }
254    return param;
255  }
256}

关于.NET 2.0的这一知识点不了解的朋友可以下载Web Cast课程进行学习。本文就简单的介绍这些。

  七、.NET 2.0中的新ADO.NET操作接口应用示例

 建立一ASP.NET网站项目,在默认的Default.aspx里放置一个GridView控件便OK。这里以MSSQL 2000里的Northwind数据库作为示例数据库,查询出订单表的数据呈现在aspx页面上,进入后台代码文件(.cs文件):

1public partial class _Default : System.Web.UI.Page
2{
3  protected void Page_Load(object sender, EventArgs e)
4  {
5    string connectionString="Data Source=.;Initial Catalog=Northwind;user id=sa;password=;";
6    string cmdText = "select * from orders";
7
8    ProviderFactory factory = new ProviderFactory(ProviderType.SqlClient);
9    IDbConnection conn = factory.CreateConnection(connectionString);
10    IDbDataAdapter sda = factory.CreateDataAdapter(cmdText, conn);
11    DataSet ds = new DataSet();
12    sda.Fill(ds);
13    this.GridView1.DataSource = ds.Tables[0];
14    this.GridView1.DataBind();
15  }
16}

   ProviderFactory担任着工厂的角色,负责创建如IDbConnection、IDbCommand等一系列的产品。如上,我们拿到了工厂 角色,通过工厂角色的CreateConnection就创建到了一个基于抽象产品角色IDbConnection接口的实现对象(具体是什么实现对象我 们暂不管)。

  .NET 2.0提供了这一套操作接口,对于程序实现上就更加灵活了,更是强调了使用“依赖接口/抽象编程”的思想。

  注:转载请注明出处:http://beniao.cnblogs.com/

分享到:
评论

相关推荐

    抽象工厂设计模式抽象工厂设计模式

    抽象工厂设计模式抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式

    JAVA设计模式之抽象工厂

    在Java中,抽象工厂模式通常用于创建一组相关的或相互依赖的对象,而无需指定它们的具体类。这种模式的关键在于抽象工厂类,它定义了一组接口,用于创建不同产品族的实例。产品族是一组相关或相互依赖的对象,而产品...

    走进设计模式之抽象工厂(Abstract Factory)

    总之,"走进设计模式之抽象工厂"这篇博客深入探讨了抽象工厂模式的原理、实现方式、应用场景及其优缺点,旨在帮助读者理解并有效地运用这一设计模式。通过阅读博客和分析提供的代码示例,开发者可以更好地掌握抽象...

    NET设计模式之抽象工厂模式[归纳].pdf

    抽象工厂模式是设计模式中的一种,属于创建型模式,它的主要目的是为了解决在软件系统中,面对一系列相互依赖的对象的创建问题。这种模式提供了一个创建一系列相关或相互依赖对象的接口,而不必指定它们的具体类。...

    IOS 设计模式抽象工厂实例Demo

    抽象工厂模式是设计模式中的一种,尤其适用于创建一组相关或相互依赖的对象。这个实例Demo将向我们展示如何在iOS环境中应用抽象工厂模式。 抽象工厂模式的核心思想是提供一个接口,用于创建一系列相关或相互依赖的...

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...

    设计模式 - 抽象工厂模式

    设计模式 - 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际...

    设计模式-抽象工厂模式(讲解及其实现代码)

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...

    设计模式-抽象工厂模式

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...

    java设计模式之抽象工厂模式

    java设计模式之抽象工厂模式实例,希望对大家有所帮助。

    JAVA设计模式之抽象工厂模式

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体类。这种模式允许客户端使用一个通用接口来创建一组相关或相互依赖的对象,而无需了解它们的具体实现。在Java中,抽象...

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    java设计模式-抽象工厂模式

    抽象工厂模式是设计模式中的一种,它属于创建型模式,主要解决的是当系统有多个产品族,而每个产品族又有多个具体产品时,如何组织代码的问题。在Java中,抽象工厂模式提供了一种创建对象组的方式,使得这些对象属于...

    设计模式抽象工厂实验报告

    实验的核心在于理解和实践**抽象工厂模式**,这是一种常用的面向对象设计模式,旨在解决软件设计中的灵活性和扩展性问题。实验的目标包括: 1. **深入理解抽象工厂模式的基本概念和原理**:通过理论学习和实际操作...

    设计模式:单例设计模式(全部实现方式)工厂设计模式,抽象工厂模式

    单例设计模式、工厂设计模式和抽象工厂模式是常见的软件开发设计模式。这些设计模式提供了一些有用的思想和实现方式,可以帮助开发人员在设计和实现复杂的软件系统时,更加灵活和高效地进行编程。 单例设计模式是一...

    设计模式 抽象工厂模式 反射 配置文件

    设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂...

    设计模式--抽象工厂模式实现多数据库连接

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。在.NET开发中,这种模式常用于实现多数据库连接,比如连接到MySQL、SQL Server或Oracle等不同的数据库系统。...

    三种设计模式(简单工厂_工厂方法_抽象工厂)

    抽象工厂模式是最为复杂的一种工厂模式,它提供了创建相关或依赖对象的家族,而无需指定它们的具体类。这种模式主要用于当产品族中的对象需要一起使用时,确保它们都属于同一产品等级结构。抽象工厂可以确保客户端...

    设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)

    设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)

    Java设计模式之抽象工厂模式

    总结来说,Java设计模式之抽象工厂模式是一种用来创建一系列相关对象的设计模式,它通过提供抽象工厂接口来隔离具体产品的创建,使系统具备更好的扩展性和封装性。在实际开发中,我们可以根据需求选择使用抽象工厂...

Global site tag (gtag.js) - Google Analytics