.NET 框架下的AbstractFactory模式

来源:互联网 发布:逃离北上广的数据 编辑:程序博客网 时间:2024/06/07 03:47
这里只是从别的角度阐述一下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; }
    }

    看到这里大家应该明白一些了吧。顾名思议,SqlClientFactory就是AbstractFactory模式图中的
ContreateFactory1类 ,对应永红的图中的SqlDbInterface接口。另外大家也可以从ORACLE,MySql官方
下载最新的DLL,反射里面的OracleClientFactory和MySqlClientFactory代码,大家会看到DLL中的相关方
法“模样”大同小异。

     注:为了使用这个DbProviderFactory类,微软还出了一些辅助类,如:
          DbParameter 继承自 IDataParameter    
          DataAdapter 继承自 IDataAdapter
          DbDataAdapter    继承自 IDbDataAdapter  
          DbDataReader 继承自  IDataReader

     并且这些类基本都是抽象类:)

     
0 0
原创粉丝点击