iOS设计模式之抽象工厂模式

55 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情


设计模式相信大家都很熟悉了,但是越是基础的东西也越是需要经常的回顾与思考,于是着手写一个温故而知新的设计模式回顾系列。
在 8 月,准备把各个常用的不常用的设计模式都进行一次回顾,并大概聊一下各个模式的特点与在 iOS 中的大概使用场景与情况。

这里是设计模式回顾的第七篇,抽象工厂模式的相关回顾。

抽象工厂模式

1、什么是抽象工厂模式

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。 抽象工厂由多个产品抽象类、一个抽象工厂类、多个具体产品子类、多个具体工厂类组成。当多个产品抽象类中有相同类型的子类的时候,就可以通过抽象工厂模式生成。
例如宝马和福特都有生产代步车和商务车,那么就可以定义代步车工厂和商务车工厂,每个工厂都有 createBMWCar 和 createFordCar。通过工厂生成详细的宝马或者福特的车辆。

2、抽象工厂模式用在什么地方

  • 在多种类中有相同系列产品的时候可以使用抽象工程代替创建

在许多情况下,抽象工厂和工厂模式容易相互转换,有时候系列产品的数量减少就会从抽象工厂变成工厂,相反,系列产品的数量的增加也有可能导致工厂变成抽象工厂。

3、抽象工厂模式的使用

  1. 创建抽象工厂类,引用抽象产品类
  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()
    }
}