携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
设计模式相信大家都很熟悉了,但是越是基础的东西也越是需要经常的回顾与思考,于是着手写一个温故而知新的设计模式回顾系列。
在 8 月,准备把各个常用的不常用的设计模式都进行一次回顾,并大概聊一下各个模式的特点与在 iOS 中的大概使用场景与情况。
这里是设计模式回顾的第七篇,抽象工厂模式的相关回顾。
抽象工厂模式
1、什么是抽象工厂模式
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。 抽象工厂由多个产品抽象类、一个抽象工厂类、多个具体产品子类、多个具体工厂类组成。当多个产品抽象类中有相同类型的子类的时候,就可以通过抽象工厂模式生成。
例如宝马和福特都有生产代步车和商务车,那么就可以定义代步车工厂和商务车工厂,每个工厂都有 createBMWCar 和 createFordCar。通过工厂生成详细的宝马或者福特的车辆。
2、抽象工厂模式用在什么地方
- 在多种类中有相同系列产品的时候可以使用抽象工程代替创建
在许多情况下,抽象工厂和工厂模式容易相互转换,有时候系列产品的数量减少就会从抽象工厂变成工厂,相反,系列产品的数量的增加也有可能导致工厂变成抽象工厂。
3、抽象工厂模式的使用
- 创建抽象工厂类,引用抽象产品类
- 抽象工厂类创建对应抽象产品的创建方法
- 实现具体工厂,并在具体工厂中创建具体产品。
4、总结
抽象工厂在定义上容易和工厂相混,不过实际使用上还是容易分别的,不过都属于创建类型的设计模式,而两者可以相互转换,可以不用特别注意他属于哪一种,但是定义和理解最好要清晰。
抽象工厂还是属于基础的设计模式,是工厂的抽象级的实现。
5、demo
/// 牛肉食物
class BeefFood: NSObject {
}
/// 牛肉堡
class BeefBuger: BeefFood {
let price = 20
}
/// 牛肉卷
class BeefTwister: BeefFood {
let price = 23
}
/// 鸡肉食物
class ChickenFood: NSObject {
}
/// 鸡肉堡
class ChickenBuger: ChickenFood {
let price = 15
}
/// 鸡肉卷
class ChickenTwister: ChickenFood {
let price = 18
}
/// 食物工厂
class FoodFactory: NSObject {
/// 鸡肉食物
func createChicken() -> ChickenFood {
return ChickenFood()
}
/// 牛肉食物
func createBeef() -> BeefFood {
return BeefFood()
}
}
/// 汉堡工厂
class BurgerFactory: FoodFactory {
/// 鸡肉汉堡
override func createChicken() -> ChickenBuger {
return ChickenBuger()
}
/// 牛肉汉堡
override func createBeef() -> BeefBuger {
return BeefBuger()
}
}
/// 卷工厂
class TwisterFactory: FoodFactory {
/// 鸡肉卷
override func createChicken() -> ChickenTwister {
return ChickenTwister()
}
/// 牛肉卷
override func createBeef() -> BeefTwister {
return BeefTwister()
}
}