抽象工厂是创建其他工厂方法的超级工厂.
1. 意图
抽象工厂模式提供了一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类.
2. 适用场景
- 系统要独立于它的产品的创建, 组合和表示时.
- 系统要由多个产品系列中的一个来配置时.
- 需要强调一系列相关产品对象的设计, 以便进行联合使用时.
- 需要提供一个产品类库, 而只想显示他们的接口而不是实现时.
3. 实现
3.1. 参与者
- AbstractFactory
声明一个创建抽象产品对象的操作接口 - ConcreteFactory
实现创建具体产品对象的操作 - AbstractProduct
为一类产品对象声明一个接口 - ConcreteProduct
实现 AbstractProduct 接口, 定义一个将被相应的具体工厂创建的产品对象. - Client
仅使用由 AbstractFactory 和 AbstractProduct 类声明的接口.
通常在运行时创建一个 ConcreteFactory 类的实例. 这一具体工厂创建具有特定实现的产品对象. 为创建不同的产品对象, 客户应使用不同的具体工厂.
AbstractFactory 将产品对象的创建延迟到它的 ConcreteFactory 子类.
3.2. 结构
3.3. 开发规范
- 将工厂实现为单例
一个应用中一般每个产品系列只需要一个 ConcreteFactory 的实例. 因此工厂通常最好实现为一个单例. - 创建产品
AbstractFactory 仅声明一个创建产品的接口, 真正创建产品是由 ConcreteFactory 子类实现的. - 定义可扩展的工厂
最通常的一个办法是为每一类产品定义一个工厂方法. 但如果新增一种产品, 则需要改变 AbstractFactory 以及其相关的类.
为避免此问题, 一种更灵活但不太安全的方式就是给创建对象的方法增加一个参数, 用于指定需要创建的对象的类型. 它可以是一个类标识符, 一个整数, 一个字符串, 或其他任何可以标识这种产品的东西. 实际使用时, AbstractFactory 只需要一个make()方法和一个指示要创建对象的种类的参数. # 意图