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@ 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@}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////