本博客实例已同步到github
抽象工厂模式是工厂方法模式的升级版本
- 工厂方法模式只生产一个等级的产品,如TCL和海尔生产空调
- 而抽象工厂模式可生产多个等级的产品,如TCL和海尔不仅生产空调,而且生产电冰箱。此时TCL和海尔叫做产品族。空调和电冰箱是产品结构
- 当系统中只存在一个等级结构产品的时候,抽象工厂会退化到工厂方法模式
抽象工厂模式使用场景
- 客户端不依赖一产品类实例如何被创建、实现等细节
- 强调一系列相关的产品对象器使用创建对象需要大量重复的代码
- 提供一个产品类的库,所以产品以接口出现,客户端不依赖具体实现
缺点:产品中扩展新的产品困难,需要修改抽象工厂的接口
角色结构
包含5中角色(和工厂方法模式一样)
- 产品接口
- 实际产品
- 工厂接口
- 不同于工厂方法模式,这个工厂中包含多个方法(即多个产品等级结构)
- 实际生成产品的工厂
- 客户端
工厂模式之间的区别
细说简单工厂模式,工厂方法模式和抽象工厂模式之间的区别
对于下图来说:
产品等级结构可理解为具体产品:电冰箱,电视,空调
产品族可理解为工厂品牌:海尔,海飞丝,海信,格力,杰士邦
我在gihub上同步了三个框架相同的例子来描述这三种模式的代码,需要可以查看
如果有多个产品等级结构,(且每个产品族有多个产品族),则适合于抽象工厂模型
如果只有一个产品等级结构,如只有方形,圆形或者椭圆形,则退化为工厂方法模型
如果只有一个产品等级结构,且只有一个产品族,则退化为简单工厂模型
抽象工厂模式的实例
-
JavaSE中的Button和Text对应不同的Windows和Linux
-
数据库连接的Connect和Statement都是抽象工厂接口
-
MyBatis中的SqlSession也是一个抽象工厂接口