.NET中的抽象工厂

 我们说过,抽象工厂针对系列产品的应变。在使用ADO.NET进行数据访问的时候,如果目标数据库是Access,我们会使用OleDbConnection、OleDbCommand以及OleDbDataAdapter等一系列ADO.NET对象。那么如果数据库是SQL Server,我们又会改用SqlConnection、SqlCommand以及SqlDataAdapter等一系列ADO.NET对象。如果只使用一套对象,没有什么大问题,如果我们的数据访问有系列变化的需求,比如可以针对Access和SQL Server,而且希望改换数据库尽量对客户端代码透明,那么就需要引入抽象工厂模式。

  好在,ADO.NET 2.0中已经有了整套抽象工厂的类型。看下面的代码,你应该能辨别这些类型在抽象工厂中的角色:

 

  public abstract class DbProviderFactory
  {
  // Methods
  protected DbProviderFactory()
  {
  }
  public virtual DbCommand CreateCommand()
  {
  return null;
  }
  public virtual DbCommandBuilder CreateCommandBuilder()
  {
  return null;
  }
  public virtual DbConnection CreateConnection()
  {
  return null;
  }
  public virtual DbConnectionStringBuilder CreateConnectionStringBuilder()
  {
  return null;
  }
  public virtual DbDataAdapter CreateDataAdapter()
  {
  return null;
  }
  public virtual DbDataSourceEnumerator CreateDataSourceEnumerator()
  {
  return null;
  }
  public virtual DbParameter CreateParameter()
  {
  return null;
  }
  public virtual CodeAccessPermission CreatePermission(PermissionState state)
  {
  return null;
  }
  // Properties
  public virtual bool CanCreateDataSourceEnumerator
  {
  get
  {
  return false;
  }
  }
  }
  public sealed class OleDbFactory : DbProviderFactory
  {
  // Fields
  public static readonly OleDbFactory Instance = new OleDbFactory();
  // Methods
  private OleDbFactory()
  {
  }
  public override DbCommand CreateCommand()
  {
  return new OleDbCommand();
  }
  public override DbCommandBuilder CreateCommandBuilder()
  {
  return new OleDbCommandBuilder();
  }
  public override DbConnection CreateConnection()
  {
  return new OleDbConnection();
  }
  public override DbConnectionStringBuilder CreateConnectionStringBuilder()
  {
  return new OleDbConnectionStringBuilder();
  }
  public override DbDataAdapter CreateDataAdapter()
  {
  return new OleDbDataAdapter();
  }
  public override DbParameter CreateParameter()
  {
  return new OleDbParameter();
  }
  public override CodeAccessPermission CreatePermission(PermissionState state)
  {
  return new OleDbPermission(state);
  }
  }
  public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider
  {
  // Fields
  public static readonly SqlClientFactory Instance = new SqlClientFactory();
  // Methods
  private SqlClientFactory()
  {
  }
  public override DbCommand CreateCommand()
  {
  return new SqlCommand();
  }
  public override DbCommandBuilder CreateCommandBuilder()
  {
  return new SqlCommandBuilder();
  }
  public override DbConnection CreateConnection()
  {
  return new SqlConnection();
  }
  public override DbConnectionStringBuilder CreateConnectionStringBuilder()
  {
  return new SqlConnectionStringBuilder();
  }
  public override DbDataAdapter CreateDataAdapter()
  {
  return new SqlDataAdapter();
  }
  public override DbDataSourceEnumerator CreateDataSourceEnumerator()
  {
  return SqlDataSourceEnumerator.Instance;
  }
  public override DbParameter CreateParameter()
  {
  return new SqlParameter();
  }
  public override CodeAccessPermission CreatePermission(PermissionState state)
  {
  return new SqlClientPermission(state);
  }
  object IServiceProvider.GetService(Type serviceType)
  {
  object obj2 = null;
  if (serviceType == GreenMethods.SystemDataCommonDbProviderServices_Type)
  {
  obj2 = GreenMethods.SystemDataSqlClientSqlProviderServices_Instance();
  }
  return obj2;
  }
  // Properties
  public override bool CanCreateDataSourceEnumerator
  {
  get
  {
  return true;
  }
  }
  }
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值