VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#设计模式学习笔记:(3)抽象工厂模式(2)

AbstractFactory europeanFactory = new EuropeanFactory(); europeanFactory.CreateRoof().Create(); europeanFactory.CreateFloor().Create(); europeanFactory.CreateWindow().Create(); europeanFactory.CreateDoor().Create(); //现代风格的房子 AbstractFactory modernizationFactory = new ModernizationFactory(); modernizationFactory.CreateRoof().Create(); modernizationFactory.CreateFloor().Create(); modernizationFactory.CreateWindow().Create(); modernizationFactory.CreateDoor().Create(); //古典风格的房子 AbstractFactory classicalFactory = new ClassicalFactory(); classicalFactory.CreateRoof().Create(); classicalFactory.CreateFloor().Create(); classicalFactory.CreateWindow().Create(); classicalFactory.CreateDoor().Create(); Console.Read(); #endregion } }
复制代码

    运行结果如下:

    从上面代码可以看出,需要添加5个类:4个类分别创建古典风格的房顶、地板、窗户和房门的具体产品,另外一个是古典风格房子的工厂类,负责创建

古典风格的房子。

    从上面代码可以看出,抽象工厂对于系列产品的变化支持开闭原则(对扩展开放,对修改封闭),扩展起来非常简便。但是,抽象工厂对于增加新产品

这种情况就不支持开闭原则,因为要修改创建系列产品的抽象基类AbstractFactory,增加相应产品的创建方法,这也是抽象工厂的缺点所在。

    三、抽象工厂模式的实现要点

    1)如果没有应对“多系列对象创建”的需求变化,则没有必要使用AbstractFactory模式,这时候使用简单工厂模式完全可以。

    2)"系列对象"指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中“道路”与“房屋”的依赖,“道路”与“地道”的依赖。

    3)AbstractFactory模式主要在于应对“新系列”的需求变动,其缺点在于难以应对“新对象”的需求变动

    4)AbstractFactory模式经常和FactoryMethod模式共同组合来应对“对象创建”的需求变化。

    3.1、抽象工厂模式的优点

    抽象工厂模式将系列产品的创建工作延迟到具体工厂的子类中,我们声明工厂类变量的时候使用的是抽象类型,同理,我们使用产品类型也是抽象类型,

这样做可以尽可能地减少客户端代码与具体产品类之间的依赖,从而降低了系统的耦合度。耦合度降低了,对于后期的维护和扩展就更有利,这就是抽象

工厂模式的优点所在。

    可能有人会说在Main方法里面(客户端)还是会使用具体的工厂类,对的。这个其实我们可以通过.Net配置文件把这部分移出去,把依赖关系放到配置文

件中。如果有新的需求我们只需要修改配置文件,根本就不需要修改代码了,让客户代码更稳定。依赖关系肯定会存在,我们要做的就是降低依赖,想完全

去除很难,也不现实。

    3.2、抽象工厂模式的缺点

    有优点肯定就有缺点,因为每种模式都有它的使用范围,或者说不能解决的问题就是缺点。抽象工厂模式很难支持增加新产品的变化,这是因为抽象工厂

接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类以及所有子类的改变,这样

也就违背了开闭原则。

    3.3、抽象工厂模式的使用场景

    如果系统需要多套的代码解决方案,并且每套的代码方案中又有很多相互关联的产品类型,并且在系统中可以相互替换地使用一套产品的时候就可以使用

该模式,客户端不需要依赖具体实现。

    四、.NET中抽象工厂模式的实现

    微软的类库发展了这么多年,设计模式在里面有大量的应用。抽象工厂模式在.NET类库中也存在着大量的使用,比如和操作数据库有关的类型,这个类是

System.Data.Common.DbProviderFactory,此类位于System.Data.dll程序集中。该类扮演抽象工厂模式中抽象工厂的角色,我们可以用ILSpy反编译工具查

看该类的实现:

    /// 扮演抽象工厂的角色
    /// 创建连接数据库时所需要的对象集合
    /// 这个对象集合包括有DbConnection对象(抽象产品类)、DbCommand类、DbDataAdapter类,针对不同的具体工厂都需要实现该抽象类中的方法。

复制代码
    public abstract class DbProviderFactory
    {
        public virtual bool CanCreateDataSourceEnumerator
        {
            get
            {
                return false;
            }
        }

        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 DbParameter CreateParameter()
        {
            return null;
        }

        public virtual CodeAccessPermission CreatePermission(PermissionState state)
        {
            return null;
        }

        public virtual DbDataSourceEnumerator CreateDataSourceEnumerator()
        {
            return null;
        }
    }
复制代码

    DbProviderFactory类是一个抽象工厂类,该类提供了创建数据库连接时所需要的对象集合的接口,实际创建工作在其子类工厂中进行。微软使用的是

SQL Server数据库,因此提供了连接SQL Server数据的具体工厂实现,具体代码可以用反编译工具查看。

    SqlClientFactory扮演着具体工厂的角色,用来创建连接SQL Server数据所需要的对象:

复制代码
    public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider
    {
        public static readonly SqlClientFactory Instance = new SqlClientFactory();

        public override bool CanCreateDataSourceEnumerator
        {
            get
            {
                return true;
            }
        }

        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 DbParameter CreateParameter()
        {
            return new SqlParameter();
        }

        public override CodeAccessPermission CreatePermission(PermissionState state)
        {
            return new SqlClientPermission(state);
        }

        public override DbDataSourceEnumerator CreateDataSourceEnumerator()
        {
            return SqlDataSourceEnumerator.Instance;
        }

        object IServiceProvider.GetService(Type serviceType)
        {
            object result = null;
            if (serviceType == GreenMethods.SystemDataCommonDbProviderServices_Type)
            {
                result = GreenMethods.SystemDataSqlClientSqlProviderServices_Instance();
            }
            return result;
        }
    }
复制代码

    OdbcFactory也是具体工厂类:

复制代码
    public sealed class OdbcFactory : DbProviderFactory
    {
        public static readonly OdbcFactory Instance = new OdbcFactory();

        private OdbcFactory()
        {
        }

        public override DbCommand CreateCommand()
        {
            return new OdbcCommand();
        }

        public override DbCommandBuilder CreateCommandBuilder()
        {
            return new OdbcCommandBuilder();
        }

        public override DbConnection CreateConnection()
        {
            return new OdbcConnection();
        }

        public override DbConnectionStringBuilder CreateConnectionStringBuilder()
        {
            return new OdbcConnectionStringBuilder();
        }

        public override DbDataAdapter CreateDataAdapter()
        {
            return new OdbcDataAdapter();
        }

        public override DbParameter CreateParameter()
        {
            return new OdbcParameter();
        }

        public override CodeAccessPermission CreatePermission(PermissionState state)
        {
            return new OdbcPermission(state);
        }
    }
复制代码

    当然,我们也有OleDbFactory类型,都是负责具体的数据库操作。DbProviderFactory就是抽象工厂模式UML里面AbstractFactory类型,其它具体的工厂类

型继承于DbProviderFactory类型。

    五、总结

    学习设计模式不能死学,要把握核心点和使用场景,关键点是面向对象设计模式的基本原则。有了原则,考虑问题就不会跑偏,然后再仔细把握每种模式的

使用场景和要解决的问题,多写写代码,多看看Net的类库,它是最好的教材。


相关教程
关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号