.NET中的抽象工厂

来源:互联网 发布:网络13邯大主教楼视频 编辑:程序博客网 时间:2024/06/11 08:19
我们说过,抽象工厂针对系列产品的应变。在使用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;
  }
  }
  }
 
 
原创粉丝点击