抽象工厂模式「Abstact Factory Pattern」,是围绕一个超级工厂创建其他工厂,可以说是工厂的工厂。属于创建型模式,它提供了创建对象的最佳方式。
- 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 主要解决:解决接口选择的问题。
- 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终使用一个产品族中的对象。
- 缺点:产品族扩展非常困难,想要增加一个系列的产品,既要在抽象的 Creator 里增加代码,也要在具体的产品实现类里增加代码。
具体实现
定义
import Cocoa
protocol ICarProducer { }
protocol ICar: ICarProducer { func drive() }
protocol ICarColor: ICarProducer { func bodyColor() }
class BenzCar: ICar { required init() { } func drive() { print("我开的是大奔...") } }
class BMWCar: ICar { required init() { } func drive() { print("我开的是宝马...") } }
class MaseratiCar: ICar { required init() { } func drive() { print("我开的是玛莎拉蒂...") } }
class White: ICarColor { required init() { } func bodyColor() { print("车身颜色是白色的.") } }
class Black: ICarColor { required init() { } func bodyColor() { print("车身颜色是黑色的.") } }
class Yellow: ICarColor { required init() { } func bodyColor() { print("车身颜色是黄色的.") } }
protocol ICarFactory { func createCar(type: ICar.Type) -> ICar? func createCar<Car: ICar>() -> Car? func getCarBodyColor(type: ICarColor.Type) -> ICarColor? }
extension ICarFactory { func createCar(type: ICar.Type) -> ICar? { nil } func createCar<Car: ICar>() -> Car? { nil } func getCarBodyColor(type: ICarColor.Type) -> ICarColor? { nil } }
class CarFactory: ICarFactory { required init() { }
func createCar(type: ICar.Type) -> ICar? { if let benz = type as? BenzCar.Type { return benz.init() } if let bmw = type as? BMWCar.Type { return bmw.init() } if let maserati = type as? MaseratiCar.Type { return maserati.init() } return nil } func createCar<Car: ICar>() -> Car? { if let benz = Car.self as? BenzCar.Type { return benz.init() as? Car } if let bmw = Car.self as? BMWCar.Type { return bmw.init() as? Car } if let maserati = Car.self as? MaseratiCar.Type { return maserati.init() as? Car } return nil } }
class CarBodyColorFactory: ICarFactory { required init() { } func getCarBodyColor(type: ICarColor.Type) -> ICarColor? { if let white = type as? White.Type { return white.init() } if let black = type as? Black.Type { return black.init() } if let yellow = type as? Yellow.Type { return yellow.init() } return nil } }
class CarFactoryProducer { class func buildCarFactory<CarAbstractFactory: ICarFactory>() -> CarAbstractFactory? { if let carFactory = CarAbstractFactory.self as? CarFactory.Type { return carFactory.init() as? CarAbstractFactory } if let colorFactory = CarAbstractFactory.self as? CarBodyColorFactory.Type { return colorFactory.init() as? CarAbstractFactory } return nil } }
|
调用
let carFactory: CarFactory? = CarFactoryProducer.buildCarFactory() let benz: BenzCar? = carFactory?.createCar() benz?.drive()
let bmw: BMWCar? = carFactory?.createCar() bmw?.drive()
let maserati: MaseratiCar? = carFactory?.createCar() maserati?.drive()
let carBodyColorFactory: CarBodyColorFactory? = CarFactoryProducer.buildCarFactory() let whiteColor = carBodyColorFactory?.getCarBodyColor(type: White.self) whiteColor?.bodyColor()
let blackColor = carBodyColorFactory?.getCarBodyColor(type: Black.self) blackColor?.bodyColor()
let yellowColor = carBodyColorFactory?.getCarBodyColor(type: Yellow.self) yellowColor?.bodyColor()
|
Author: David硕
Permalink: http://davidxiaoshuo.github.io/design_pattern/abstract_factory_pattern/
License: Copyright (c) 2019 CC-BY-NC-4.0 LICENSE
Slogan: Write readable code!