工厂模式

工厂方法模式通过选取相关的实现类来满足调用组件的请求,调用组件无需了解这些实现。

何时使用

调用组件需要根据不同情况调用多个类的时候可以考虑使用工厂

下面是示例代码

///用基类实现更合适。协议感觉有点怪。特别是下面这个全局函数func createRentalCar(by passengers:Int) -> RentalCar? {var car:RentalCar?switch passengers {case 0...1:car = Sports()case 2...3:car = Compact()case 4...8:car = SUV()case 9...14:car = Minivan()default:car = nil}return car
}///RentalCar.swiftprotocol RentalCar {var name:String { get }var passengers:Int { get }var pricePerDay:Float { get }
}class Compact: RentalCar {var name: String = "VM Golf"var passengers: Int = 3var pricePerDay: Float = 20}class Sports: RentalCar {var name: String = "Porsche Boxter"var passengers: Int = 1var pricePerDay: Float = 100
}class SUV: RentalCar {var name: String = "Cadillac Escalade"var passengers: Int = 8var pricePerDay: Float = 75
}//CarSelector.swift
class CarSelector{class func selectCar(by passengers:Int) -> String?{let car = createRentalCar(by: passengers)return car?.name}
}//main.swift
let passengers = [1,3,5]for p in passengers{print("\(p) passegers: \(CarSelector.selectCar(by: p) ?? "")")
}class PriceCalculator {class func calculatePrice(by passengers:Int,and totalDays:Int) -> Float?{if let car = createRentalCar(by: passengers) {return car.pricePerDay * Float(totalDays)}return nil}
}复制代码

输出

Hello, World!
1 passegers: Porsche Boxter
3 passegers: VM Golf
5 passegers: Cadillac Escalade
Program ended with exit code: 0
复制代码

抽象工厂

和简单工厂不一样的是,这个模式可以提供一组对象。

好处:可以在不修改调用组件的情况下,对其使用的类进行修改

什么时候使用:

当调用组件需要一组互相关联的对象,但这些对象又没有共同的父类和协议的时候。

下面是示例代码。创建一个命令行项目AbstractFactory


///FloorPlans.swift
enum EngineOption : String{case front = "Front"case mid = "Mid"
}protocol Floorplan {var seats:Int{ get }var enginePosition:EngineOption { get }}class ShortFloorplan: Floorplan {var seats: Int = 2var enginePosition: EngineOption = .mid
}class StandardFloorplan: Floorplan {var seats: Int = 4var enginePosition: EngineOption = .front
}class LongFloorplan: Floorplan {var seats: Int = 8var enginePosition: EngineOption = .front
}///Suspension.swift
enum SuspensionOption : String{case standard = "Standard"case sports = "Firm"case soft = "Soft"
}protocol Suspension {var suspensionType:SuspensionOption { get }
}class RoadSuspension: Suspension {var suspensionType: SuspensionOption = .standard
}class OffRoadSuspension: Suspension {var suspensionType: SuspensionOption = .soft
}class RaceSuspension: Suspension {var suspensionType: SuspensionOption = .sports
}///Drivetrains.swift
enum DriveOption : String{case front = "Front"case rear = "Rear"case all = "4WD"
}protocol Drivetrain {var driveType:DriveOption { get }
}class FrontWheelDrive: Drivetrain {var driveType: DriveOption = .front
}class RearWheelDrive: Drivetrain {var driveType: DriveOption = .rear}class AllWheelDrive: Drivetrain {var driveType: DriveOption = .all
}///CarParts.swift
enum Cars : String {case compact = "VM Golf"case sports = "Porsche Boxter"case suv = "Cadillac Escalade"
}struct Car {var carType:Carsvar floor:Floorplanvar suspension:Suspensionvar drive:Drivetrainfunc printDetail() {print("Car type: \(carType.rawValue)")print("Seats : \(floor.seats)")print("Engine : \(floor.enginePosition.rawValue)")print("Suspension : \(suspension.suspensionType.rawValue)")print("Drive : \(drive.driveType.rawValue)")}
}///Abstract.swift
class CarFactory {final class func getFactory(car:Cars) -> CarFactory {var factory:CarFactoryswitch car {case .compact:factory = CompactCarFactory()case .sports:factory = SportsCarFactory()case .suv:factory = SUVCarFactory()}return factory}func createFloorplan() -> Floorplan {fatalError("no implemention")}func createSuspension() -> Suspension {fatalError("no implemention")}func createDrivetrain() -> Drivetrain {fatalError("no implemention")}
}///Concrete.swift
class CompactCarFactory : CarFactory {override func createFloorplan() -> Floorplan {return StandardFloorplan()}override func createSuspension() -> Suspension {return RoadSuspension()}override func createDrivetrain() -> Drivetrain {return FrontWheelDrive()}
}class SportsCarFactory: CarFactory {override func createFloorplan() -> Floorplan {return ShortFloorplan()}override func createSuspension() -> Suspension {return RaceSuspension()}override func createDrivetrain() -> Drivetrain {return RearWheelDrive()}
}class SUVCarFactory: CarFactory {override func createFloorplan() -> Floorplan {return LongFloorplan()}override func createSuspension() -> Suspension {return OffRoadSuspension()}override func createDrivetrain() -> Drivetrain {return AllWheelDrive()}
}复制代码

工程代码下载地址github.com/RockyAo/Des…

设计模式学习-工厂模式相关推荐

  1. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  2. 设计模式学习 - 工厂模式

    工厂模式: 定义了一个创建对象的接口,但由它的子类决定实例化哪一个对象.工厂方法将对象的实例化延迟到了子类. 模式组成: 一组使用者:父类定义一个创建对象的接口及其他通用接口,子类负责创建对象接口的具 ...

  3. 设计模式学习--工厂模式

    1.概述 工厂模式根据提供给他的数据,返回一个可能类中的一个类的实例. 2.示例  1using System;  2using System.Collections.Generic;  3using ...

  4. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  5. Java设计模式之 工厂模式(简单工厂模式)

    前一阵子学习了Java 中据说是最简单的设计模式的 单例模式,想一起讨论学习的小伙伴请点击这里: Java 设计模式之单例模式 那么今天就把学习的工厂模式记录下来 工厂模式: 实现了创建者和调用者的分 ...

  6. Java设计模式之工厂模式 (工厂方法模式)

    上一篇我们学习了简单工厂模式,最后对于增加新产品的缺点,我们在工厂方法模式中解决. 为学习简单工厂模式的小伙伴点击这里Java 设计模式之工厂模式(简单工厂模式) 工厂方法模式要点: 避免简单工厂模式 ...

  7. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  8. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  9. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

最新文章

  1. Git 2.25.0发布,支持部分clone、稀疏checkout
  2. SAP BPC系统架构
  3. 二叉树、二叉排序树及其遍历
  4. 一步一步学linq to sql(二)
  5. ASP.NET MVC 整合 Spring.net(1)- Controller进容器
  6. 面向知识图谱的信息抽取
  7. Vue.$nextTick
  8. pc计算机怎么设置域名管理,如何设置域名的DNS服务器 -电脑资料
  9. java打印计算机_在Java程序中实现高精度打印
  10. 网络编程 基础 基于socket的tcp和udp连接
  11. NFC Forum发布NFC数据交换格式(NDEF)规范
  12. 硬方案——从数据采样到滤波要求,一步一步教你设计“抗混叠滤波器”
  13. PAT 甲级考试终于满分了
  14. Kubernetes学习笔记——k8s基本概念初探
  15. 核心单词Word List 8
  16. KPI、KPA、OKR三者的区别
  17. FlexRay 介绍
  18. 激光雷达和相机的坐标转换以及联合标定
  19. 分享两款手机优化神器!
  20. Windows的.winmd文件解析

热门文章

  1. 计算机应用基础0039答案,2016秋5205004计算机应用基础-0039【参考答案】
  2. 「AI芯片公司」比特大陆的路线图上,除了四款TPU还有在这三个产业落地的野心
  3. 分类评价指标 F值 详解 | Micro F1 Macro F1 Weight F1
  4. 【CSS】955- 你该知道的字体 font-family
  5. 英文DIAMAUND钻石
  6. Spark-SQL 多维度聚合优化
  7. 时序逻辑滞后一拍问题
  8. MATLAB面板布局—便捷美观
  9. spit()字符串分割
  10. 数字城市的意义有哪些?如何构建数字城市?