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

}

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...