ADO.NET 2.0 完整實作抽象工廠模式,解決多資料庫存取的系列產品建立問題:
public abstract class DbProviderFactory
{
protected DbProviderFactory() { }
public virtual DbCommand CreateCommand() => null;
public virtual DbCommandBuilder CreateCommandBuilder() => null;
public virtual DbConnection CreateConnection() => null;
public virtual DbConnectionStringBuilder CreateConnectionStringBuilder() => null;
public virtual DbDataAdapter CreateDataAdapter() => null;
public virtual DbDataSourceEnumerator CreateDataSourceEnumerator() => null;
public virtual DbParameter CreateParameter() => null;
public virtual CodeAccessPermission CreatePermission(PermissionState state) => null;
public virtual bool CanCreateDataSourceEnumerator => false;
}
public sealed class OleDbFactory : DbProviderFactory
{
public static readonly OleDbFactory Instance = new OleDbFactory();
private OleDbFactory() { }
public override DbCommand CreateCommand() => new OleDbCommand();
public override DbCommandBuilder CreateCommandBuilder() => new OleDbCommandBuilder();
public override DbConnection CreateConnection() => new OleDbConnection();
public override DbConnectionStringBuilder CreateConnectionStringBuilder() => new OleDbConnectionStringBuilder();
public override DbDataAdapter CreateDataAdapter() => new OleDbDataAdapter();
public override DbParameter CreateParameter() => new OleDbParameter();
public override CodeAccessPermission CreatePermission(PermissionState state) => new OleDbPermission(state);
}
public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider
{
public static readonly SqlClientFactory Instance = new SqlClientFactory();
private SqlClientFactory() { }
public override DbCommand CreateCommand() => new SqlCommand();
public override DbCommandBuilder CreateCommandBuilder() => new SqlCommandBuilder();
public override DbConnection CreateConnection() => new SqlConnection();
public override DbConnectionStringBuilder CreateConnectionStringBuilder() => new SqlConnectionStringBuilder();
public override DbDataAdapter CreateDataAdapter() => new SqlDataAdapter();
public override DbDataSourceEnumerator CreateDataSourceEnumerator() => SqlDataSourceEnumerator.Instance;
public override DbParameter CreateParameter() => new SqlParameter();
public override CodeAccessPermission CreatePermission(PermissionState state) => new SqlClientPermission(state);
object IServiceProvider.GetService(Type serviceType) { /* 內部實作 */ }
public override bool CanCreateDataSourceEnumerator => true;
}
DbProviderFactory 抽象介面
DbProviderFactory factory = SqlClientFactory.Instance; // 或 OleDbFactory.Instance
using (DbConnection conn = factory.CreateConnection())
{
conn.ConnectionString = config.ConnectionString;
using (DbCommand cmd = factory.CreateCommand())
{
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM Users";
using (DbDataAdapter adapter = factory.CreateDataAdapter())
{
adapter.SelectCommand = cmd;
DataTable dt = new DataTable();
adapter.Fill(dt);
}
}
}