抽象工厂模式
概念:
1)产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机,
海信电视机,TCL电视机 则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视
机是父类,而具体品牌的电视机是其子类
2)产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产
品,如海尔电器工厂生产的海尔电视机,海尔电冰箱,海尔电视机位于电视机的产品等级结构中,海
尔电冰箱位于电冰箱的产品等级结构中,海尔电视机,海尔电冰箱构成了一个产品族。
概述:
抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂
不只是创建一种产品,她负责创建一族产品
定义:
抽象工厂模式:提供一个创建一系列相关或或相互依赖对象的接口,而无须指定他们具体的类。
抽象工厂模式又称为Kit模式,他是一种对象创建型模式。在抽象工厂模式中,每一个具体工厂都
提供了多个工厂方法用于生产多种不同类型的产品,这些产品构成了一个产品族
角色:
AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
ConcreteFactory(具体工厂): 它实现了在抽象工厂方法中声明的创建产品的方法,生成一组具体
产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
ConcreteProduct(具体产品): 它定义了具体工厂生产的具体产品对象,实现抽象产品接口中声明的
业务方法。
优点:
1)隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就
变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需要改变具体工厂的实
例,就可以在某种程度上改变整个软件系统的行为。
2)当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
3)增加新的产品族很方便,无须修改已有系统,符合开闭原则
缺点:
增加新的产品等级结构麻烦,需要对现有系统进行较大的修改,甚至
需要修改抽象层的代码,这显然会带来较大的不便,违背了开闭原则
使用场景:
当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构,属于
不同类型的具体产品时就可以使用抽象工厂模式。主要应用于以下场景:
1)系统中有多于一个的产品族,而每次只使用其中的某一产品族。可以通过配置文件等方式来使得用户
可以动态改变产品族,也可以很方便地增加新的产品族。
2)属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中
的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束。
3)产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。
总结
在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦,抽象工厂模式的
这种性质称为"开闭原则"的倾斜性.开闭原则要求系统对扩展开放,对修改封闭,通过扩展达到增强
其功能的目的,对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:
1) 增加产品族:对于增加新的产品族,抽象工厂模式很好的支持了开闭原则,只需要增加具体的产
品并对应增加一个新的具体工厂,对已有代码无须做任何修改
2)增加新的产品等级结构:对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂
类,在所有的工厂类中都需要增加生产新产品的方法违背了开闭原则