抽象工厂模式
1. 意图
- 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 解决接口选择的问题。
个人理解:工厂模式是根据子类实例化产品,而抽象工厂是根据选择实例化具体工厂,再使用工厂方法来实例化产品。
2. 适用场景
- 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
3. 应用实例
有一个类叫做手机工厂类(抽象工厂),而苹果手机类、小米手机类、华为手机类都是具体工厂。在这些具体工厂里,我们又可以选择性地生成产品。手机类是一个抽象产品类。苹果手机工厂类既可以实例化
iPhone 11
这个具体产品、又可以实例化iPhone X
这个具体产品。
4. 类图
说明
在抽象工厂中规定了具体工厂的方法和属性,而在抽象产品中规定了具体产品的方法和属性。
4. 优点
- 分离了具体的类
- 易于交换产品系列
- 有利于产品的一致性
5. 实现
main.swift
// 定义协议
struct PhoneSeries {
let series: [String]
}
protocol PhoneMaking {
func make() -> PhoneSeries
}
// 工厂方法实现
final class HuaweiPhone {
func make() -> PhoneSeries {
return PhoneSeries(series: ["Huawei P40", "Huawei P40 Pro"])
}
}
final class XiaomiPhone {
func make() -> PhoneSeries {
return PhoneSeries(series: ["Xiaomi 10 Pro", "Xiaomi CC9 Pro"])
}
}
// 抽象工厂
enum PhoneFactoryType: PhoneMaking {
case Huawei
case Xiaomi
func make() -> PhoneSeries {
switch self {
case .Huawei:
return HuaweiPhone().make()
case .Xiaomi:
return XiaomiPhone().make()
}
}
}
// test
let huawei = PhoneFactoryType.Huawei.make()
let xiaomi = PhoneFactoryType.Xiaomi.make()
print(huawei)
print(xiaomi)
执行结果
PhoneSeries(series: ["Huawei P40", "Huawei P40 Pro"])
PhoneSeries(series: ["Xiaomi 10 Pro", "Xiaomi CC9 Pro"])