微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐