前言
产品族:指位于不同产品等级结构中,功能相关联的产品组成的家族
例如:电脑配件有 鼠标、键盘、显示器(三种抽象产品角色)
微软可以生产鼠标、键盘、显示器 因此微软可以抽象为一种产品族;
IBM也可以生产鼠标、键盘、显示器 所以IBM是另一种产品族;
Lenovo也生产鼠标、键盘、显示器 Lenovo也是一个产品族。
什么是抽象工厂模式?
抽象工厂模式是向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。
当系统具有三个不同的产品等级结构,即有三种抽象产品角色。
1、使用工厂方法模式 一种抽象产品角色,对应一种抽象工厂角色+多种具体工厂角色。因此势必需要使用三套独立的工厂结构方可满足。(一个具体工厂角色只有一个工厂方法,只能创建一种具体产品角色)
2、使用抽象工厂模式 使用一套工厂等级结构,负责对相同或者相似等级结构的产品的创建。(一个具体工厂角色拥有N多个工厂方法,可以创建一个产品族中的N多种具体产品角色)
结论
1、工厂方法模式 一套工厂方法仅能支持一种产品角色的创建。类似一条流水线。
2、抽象工厂模式 使用一个等级结构的工厂,可以创建分属于不同产品等级结构的一个产品族的所有对象。包含了多条流水线,即一个工厂!
使用抽象工厂模式的场景
1、不关注具体产品角色的创建细节(工厂模式通用,隐藏了创建、组合和表达的细节)
2、一个系统的产品有多于一个的产品族,并且每次只消费其中某一族的产品。
3、同一个族的产品是绑定一起使用的(必满足约束)
4、使用一套API接口
实现案例:不同操作系统的视窗控件
在所有的操作系统中都有按钮、文字框等视窗控件!
- Windows操作系统
- Unix操作系统
与开闭原则的关系
1、增加新的产品族
一个抽象工厂模式的具体工厂角色即对应一个产品族。增加新的产品族,即增加一个具体工厂角色即可,满足开闭原则。
2、增加新的产品等级结构
一个抽象工厂模式的具体工厂角色的一种工厂方法对应一种产品角色,增加新的产品等级结构,需要增加一个新的工厂方法,需要更改所有的具体工厂方法,不满足开闭原则!
声明:
对于设计模式的思考总结,诸多参考自闫宏博士《Java与模式》一书,鼎力推荐。