抽象工厂模式(Abstract Factory)
结构

目的
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
考虑现实的工厂,工厂生产一件具体的产品需要用到许多零件等等,这些零件怎么来的用户不用关心,用户只需要关心如何从工厂中取出想要的产品即可。这个工厂就是抽象工厂。进一步说,用户其实也不关心产品具体是什么产品,比如说用户要从上海到北京,用户可以选择自己的 出行交通(抽象产品) ,飞机、汽车、高铁……,而对于汽车,其实用户不关心打的车是马自达还是卡宴,只要是四个轮能跑即可。而用户也不用关心是去 12345 买高铁票,还是去嘀嘀打车订专车,用户只需要跟一个 统一的交通平台(抽象工厂) 下单说明是要打车、高铁、飞机即可。
动机
考虑一个多种风格标准的 UI 包,为滚动条、弹出框、按钮等 UI 组件定义不同的外观和行为。为了保证风格的可移植性,一个应用不应该为他的前端界面硬编码固定风格的 UI 。为了做到一键换肤的效果,我们可以定义一个抽象的组件工厂类 WidgetFactory 类,这个类声明了一系列用来创建每一类基本组件的接口。每类窗口组件都有一个抽象类,由具体的子类实现了窗口组件的特定风格。这样接口的使用者不需要关心具体的 UI 风格,只要直接使用抽象组件类即可。
对于某一类风格的 UI 其组件是相互依赖的,如何创建相互依赖的组件呢?可以使用抽象工厂类的对应风格实现类,来创建对应风格的 UI 组件。用代码标识类似这种样子:
AbstractFactory factory = new SpecialFactory();
Window window = factory.createWindow(); // SpecialWindow
ScrollBar scrollBar = factory.createScrollBar(); // SpecialScrollBar
使用场景
- 系统要独立于他的产品(类)的创建、组合和表示
- 系统要由多个产品系列中的一个来配置
- 要强调一系列相关的产品对象的设计以便联合使用
- 提供一个产品类库,但只想使用他们的接口而不是实现
要素
- AbstractFactory 抽象工厂
- ConcreateFactory 工厂实现(多个)
- AbstractProduct 抽象产品
- ConcreteProduct 产品实现(多个)
- Client 用户
缺点
难以支持新种类产品的创建,如果要支持新的产品创建,则需要对所有实现类都跟随抽象工厂做修改。
解决方案,使用工厂方法(Factory Method)模式,通过传入希望得到的产品类型,具体的工厂实现类按照传入的类