抽象工厂模式
抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。
每个模式都是针
对一定问题的解决方案。抽象工厂模式面对的问题是多产品等级结构的系统设计。
在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。
产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的CPU和ADM芯片的主板,组成一个家族。Intel的CPU和 Intel芯片的主板,又组成一个家族。而这两个家族都来自于两个产品等级:CPU,主板。一个等级结构是由相同的结构的产品组成http://dl.iteye.com/upload/attachment/368575/66b49ccd-8d8f-3530-be88-bfaf5d2a59a9.png
在以下情况可以使用Abstract Factory模式
1这个系统的产品有多于一个的产品簇,而系统只消费其中某一族的产品。
2同属于同一产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
3系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
抽象工厂模式有下面的一些优点和缺点:
1) 它分离了具体的类Abstract Factory模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。
2) 它使得易于交换产品系列一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。
3) 它有利于产品的一致性当一个系列中的产品对象被设计成一起工作时,一个应用一
次只能使用同一个系列中的对象,这一点很重要。而抽象工厂很容易实现这一点。
4) 难以支持新种类的产品难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂接口确定了可以被创建的产品集合。支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。我们会在实现一节讨论这个问题的一个解决办法。
http://dl.iteye.com/upload/attachment/368578/0d052e02-fdcb-36d4-a4a4-c1ad24db4e8a.png
http://dl.iteye.com/upload/attachment/368577/c3294039-ae05-3176-80c4-4fbd709335a4.png
这里有两个产品族:windowns产品族和unix产品族。
Windowns产品族有winButton和winText组成,unix产品族由UnixButton和UnixText组成。我们可以创建两个工厂winFactory和unixFactory。winFactory负责创建windowns产品族中的产品,unixFactory负责创建unxi产品族中的产品。这就是抽象工厂模式的应用。
http://dl.iteye.com/upload/attachment/368581/2d628fac-f1d8-32d1-b956-807578704f60.png
<!--EndFragment-->
页:
[1]