swift - Abstract Factory Pattern
It allows a calling component to obtain a family or group of related objects without needing to know which classes were used to create them. 每一层的创建都是工厂,并且客户端和中间层是不知道具体零件的类型的。
client: let car = Car(carType: Cars.SPORTS); car.printDetails(); design pattern: enum Cars: String { case COMPACT = "VW Golf"; case SPORTS = "Porsche Boxter"; case SUV = "Cadillac Escalade"; } struct Car { var carType:Cars; var floor:Floorplan; var suspension:Suspension; var drive:Drivetrain;
init(carType:Cars) { let concreteFactory = CarFactory.getFactory(carType); self.floor = concreteFactory!.createFloorplan(); self.suspension = concreteFactory!.createSuspension(); self.drive = concreteFactory!.createDrivetrain(); self.carType = carType; }
func printDetails() { println("Car type: (carType.rawValue)"); println("Seats: (floor.seats)"); println("Engine: (floor.enginePosition.rawValue)"); println("Suspension: (suspension.suspensionType.rawValue)"); println("Drive: (drive.driveType.rawValue)"); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class CarFactory {
required init() { // do nothing }
func createFloorplan() -> Floorplan { fatalError("Not implemented"); }
func createSuspension() -> Suspension { fatalError("Not implemented"); }
func createDrivetrain() -> Drivetrain { fatalError("Not implemented"); }
final class func getFactory(car:Cars) -> CarFactory? { var factoryType:CarFactory.Type; switch (car) { case .COMPACT: factoryType = CompactCarFactory.self; case .SPORTS: factoryType = SportsCarFactory.self; case .SUV: factoryType = SUVCarFactory.self; } var factory = factoryType.sharedInstance; if (factory == nil) { factory = factoryType(); } return factory; }
class var sharedInstance:CarFactory? { get { return nil; } } } class CompactCarFactory : CarFactory { override func createFloorplan() -> Floorplan { return StandardFloorplan(); } override func createSuspension() -> Suspension { return RoadSuspension.getInstance(); } override func createDrivetrain() -> Drivetrain { return FrontWheelDrive(); } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
protocol Floorplan { var seats:Int { get } var enginePosition:EngineOption { get }; } enum EngineOption : String { case FRONT = "Front"; case MID = "Mid"; } class ShortFloorplan: Floorplan { var seats = 2; var enginePosition = EngineOption.MID } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |