网站首页

家园论坛

老版论坛

家园博客

业界新闻

技术文档

下载中心

速查中心

图片中心

硬件资讯
上一篇:无废话C#设计模式之二:Singleton 下一篇:无废话C#设计模式之四:Factory Method
无废话C#设计模式之三:Abstract Factory

来源: 作者: 添加日期:2007-12-2 10:25:47 点击次数:

 

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

l         好在,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;

            }

        }

}

本新闻共3页,当前在第3页  1  2  3  

 
设为首页 | 加入收藏 | 业务办理 | 友情链接 | 论坛版面 | 浙ICP备07502118号 |