首页 / 软件开发 / .NET编程技术 / .NET2.0框架中的AbstractFactory模式
.NET2.0框架中的AbstractFactory模式2011-02-06我这里只是从别的角度阐述一下AbstractFactory在这种应用场景下的发展,内容不多,希望大家见谅。1. DbService 是我看到的第一个使用抽象工厂模式设计的数据库链接类。其实在几年前网上就有人写了这个东西,代码不多,但应用的背景和设计思路与永红(http://www.cnblogs.com/Yahong111/archive/2007/07/18/822946.html)的思路非常相似。大家可以去网上搜一搜就知道了。2. 微软也采用了这种模式在他们的NET2.0框架中。我甚至可以对NET2.0中的新添的一些类与模式文章中类内容对号入座。只要大家Reflector看一下.NET2.0框架代码即可。为了清楚起见,我只在这里做一下简单说明,旨在抛砖引玉。System.Data.Common.DbProviderFactory, 位置在System.Data.dll中。注意这是一个 抽象类public abstract class DbProviderFactory
{
// Methods
protected DbProviderFactory();
public virtual DbCommand CreateCommand();
public virtual DbCommandBuilder CreateCommandBuilder();
public virtual DbConnection CreateConnection();
public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();
public virtual DbDataAdapter CreateDataAdapter();
public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();
public virtual DbParameter CreateParameter();
public virtual CodeAccessPermission CreatePermission(PermissionState state);
// Properties
public virtual bool CanCreateDataSourceEnumerator { get; }
}
这个类在Abstract Factory模式下就是AbstractFactory,也就是永红所说的那个DbInterfaceGenerator接口。但为什么微软要用抽象类而不是接口(本身也偏向于使用接口),也只有微软才知道了:)。目前我的理解是减少基类中一些不必要的实现代码或进行条件判断时(如为 null),有相关的返回值进行比较如下:public virtual DbCommand CreateCommand()
{
return null;
}
这个函数就是DbProviderFactory类的一个虚方法,这个方法会在子类中将被重写, 而子类(SqlClientFactory)中的代码类内容如下(位于System.Data.SqlClient.SqlClientFactory)public sealed class SqlClientFactory : DbProviderFactory
{
// Fields
public static readonly SqlClientFactory Instance;
// Methods
static SqlClientFactory();
private SqlClientFactory();
public override DbCommand CreateCommand()
{
return new SqlCommand();
}
public override DbCommandBuilder CreateCommandBuilder()...
public override DbConnection CreateConnection()
{
return new SqlConnection();
}
public override DbConnectionStringBuilder CreateConnectionStringBuilder()...
public override DbDataAdapter CreateDataAdapter();
public override DbDataSourceEnumerator CreateDataSourceEnumerator()...
public override DbParameter CreateParameter()
{
return new SqlParameter();
}
public override CodeAccessPermission CreatePermission(PermissionState state);
// Properties
public override bool CanCreateDataSourceEnumerator { get; }
}