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

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值