swift - Abstract Factory Pattern

前端之家收集整理的这篇文章主要介绍了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:

@H_403_17@let car = Car(carType: Cars.SPORTS);

car.printDetails();


design pattern:

@H_403_17@enum Cars: String {

@H_403_17@ case COMPACT = "VW Golf";

case SPORTS = "Porsche Boxter";

case SUV = "Cadillac Escalade";

@H_403_17@}


@H_403_17@struct Car {

@H_403_17@ var carType:Cars;

@H_403_17@ var floor:Floorplan;

@H_403_17@ var suspension:Suspension;

@H_403_17@ var drive:Drivetrain;

@H_403_17@ init(carType:Cars) {

@H_403_17@ let concreteFactory = CarFactory.getFactory(carType);

@H_403_17@ self.floor = concreteFactory!.createFloorplan();

@H_403_17@ self.suspension = concreteFactory!.createSuspension();

@H_403_17@ self.drive = concreteFactory!.createDrivetrain();

@H_403_17@ self.carType = carType;

@H_403_17@ }

@H_403_17@ func printDetails() {

println("Car type: \(carType.rawValue)");

@H_403_17@ println("Seats: \(floor.seats)");

println("Engine: \(floor.enginePosition.rawValue)");

println("Suspension: \(suspension.suspensionType.rawValue)");

println("Drive: \(drive.driveType.rawValue)");

@H_403_17@ }

@H_403_17@}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

@H_403_17@class CarFactory {

required init() {

// do nothing

@H_403_17@ }

@H_403_17@ func createFloorplan() -> Floorplan {

fatalError("Not implemented");

@H_403_17@ }

@H_403_17@ func createSuspension() -> Suspension {

fatalError("Not implemented");

@H_403_17@ }

@H_403_17@ func createDrivetrain() -> Drivetrain {

fatalError("Not implemented");

@H_403_17@ }

@H_403_17@ final class func getFactory(car:Cars) -> CarFactory? {

@H_403_17@ var factoryType:CarFactory.Type;

@H_403_17@ switch (car) {

@H_403_17@ case .COMPACT:

@H_403_17@ factoryType = CompactCarFactory.self;

@H_403_17@ case .SPORTS:

@H_403_17@ factoryType = SportsCarFactory.self;

@H_403_17@ case .SUV:

@H_403_17@ factoryType = SUVCarFactory.self;

@H_403_17@ }

@H_403_17@ var factory = factoryType.sharedInstance;

@H_403_17@ if (factory == nil) {

@H_403_17@ factory = factoryType();

@H_403_17@ }

@H_403_17@ return factory;

@H_403_17@ }

@H_403_17@ class var sharedInstance:CarFactory? {

@H_403_17@ get {

@H_403_17@ return nil;

@H_403_17@ }

@H_403_17@ }

@H_403_17@}



@H_403_17@class CompactCarFactory : CarFactory {

@H_403_17@ override func createFloorplan() -> Floorplan {

return StandardFloorplan();

@H_403_17@ }

@H_403_17@ override func createSuspension() -> Suspension {

return RoadSuspension.getInstance();

@H_403_17@ }

@H_403_17@ override func createDrivetrain() -> Drivetrain {

return FrontWheelDrive();

@H_403_17@ }

@H_403_17@}



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


@H_403_17@protocol Floorplan {

@H_403_17@ var seats:Int { get }

@H_403_17@ var enginePosition:EngineOption { get };

@H_403_17@}


@H_403_17@enum EngineOption : String {

@H_403_17@ case FRONT = "Front"; case MID = "Mid";

@H_403_17@}


@H_403_17@class ShortFloorplan: Floorplan {

@H_403_17@ var seats = 2;

@H_403_17@ var enginePosition = EngineOption.MID

@H_403_17@}

猜你在找的Swift相关文章