模式概述
- 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题。
- 但是由于工厂方法模式中每个具体工厂只能产生一个单一的对象,如果需要工厂提供多种产品对象,那么会存在大量的工厂类,加大系统的开销。
- 可以考虑将一些相关的产品组成一个
产品族
,由同一个工厂来统一生产,这就是抽象工厂模式的基本思想。 - 例如: 我需要生产
海尔电视机,海尔冰箱,海尔空调,海信冰箱,海信空调,海信电视机,Tcl电视机,TCL冰箱,TCL空调,
如果用工厂方法模式的话,就要创建9个具体工厂类,但是如果使用抽象工厂模式的话,只需要按照产品等级结构(海尔,海信,TCL)和产品族(电视机,冰箱,空调,)划分,只需要提供三个具体工厂,极大的减少了系统种类的歌个数。 - 定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类,抽象工厂模式又成为工具模式。
模式结构
AbstractFactory
(抽象工厂):我们一组用于创建一族
产品的方法,一个方法对应一种产品。ConcreteFactory
(具体工厂):生成一组具体产品,这些产品构成了一个产品族。AbstractProduct
(抽象产品):声明产品所具有的业务方法。ConcreteProduct
(具体产品):具体产品对象。
代码实现
需求: 设计一款皮肤库,有不同风格,每种风格又分种类。风格就是等级结构,后面的就是产品族。
优缺点
- 优点:
- 隔离了具体类的生成,用户并不需要知道什么被创建,只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统行为。
- 当一个产品族中多个对象被设计成一起工作时,他能够保证客户端是终止使用同一个产品族中的对象。
- 增加新的产品族很方便,无需修改已有系统。
- 缺点:
- 增加新的产品等级结构很麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来很大的不便,违背了开闭原则。