1.抽象工厂的定义
抽象工厂(Abstract Factory)模式是所有形态的工厂模式中最为抽象和最具一般性, 也最复杂的一种形态。
为了方便描述抽象工厂模式,首先引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。如图:
所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象,**通俗的说,就是一个具体工厂创建一个产品族中的所有对象。**如果用图来描述的话,如下图:
2.角色与结构
抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统业务逻辑无关的接口(给出创建同一个系列多个对象的多个方法的声明) 。具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建同一系列多个具体产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的业务逻辑紧密相关的(实现具体的创建方法)。抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的具体对象的父类,或它们共同拥有的接口—给出产品对象业务上的共同点,与业务逻辑相关具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的业务逻辑。
3.示例
要求:
更换数据库,项目其他部分不变,只是底层数据库需要更换,如: 从Access更换为SQL Server,将来还有可能更换为Oracle… SQL Server 与 Access的不同之处: 命名空间不同:Sytem.Data.SqlClient, System.Data.OleDb 获取日期: GetDate(), Now() 获取子字符串操作: SubString, Mid Access要求Insert后面必须加into, 类似password这样的关键字作为字段名时必须用”[]”括起来。
注意看一下这个地方的源码
4.优缺点
抽象工厂模式最大的好处便是易于更换产品系列,由于具体工厂类在每个应用中只需要在初始化的时候出现一次,这就使得改变一个具体应用的具体工厂非常容易,只需要改变具体工厂即可使用不同的产品配置。我们的设计不能去防止需求的更改,因此我们的理想便是让改动变得最小。抽象工厂模式让具体的创建实例的过程与客户端分离,客户端通过它们的抽象接口操纵实例,产品的具体类名,不会出现在客户端代码中----具体类名也被具体工厂实现分离(客户端程序没有出现具体的Access或SQLServer操作类的名字)但是如果变化的不是产品系列而是产品(如:上例中的表操作—表的个数-产品等级结构- 或 表操作的个数),则抽象工厂模式封装的变化点就有问题了(开放-封闭原则的倾斜性)–抽象类应该稳定,无论何种原因导致的抽象类被频繁修改,都应该引起重视!!!如果具体工厂的创建语句在程序中大量出现,则抽象工厂模式也不适合采用。也可以用反射解耦
我寻思这应该不是重点