工厂模式的目标是将创建对象的逻辑抽取出来。
当我们拥有一组相关产品(例如多态子类或实现相同协议的多个对象)时,工厂模式非常有用。 例如,我们可以使用工厂模式检查网络响应并将其转换为具体的模型子类型。
当我们拥有单一产品类型,但它需要提供依赖关系或信息才能创建时,工厂模式也很有用。 例如,您以使用工厂模式创建 “求职者回复” 电子邮件:根据候选人是被接受,被拒绝还是需要接受面试来生成不同的电子邮件详细信息。
eq. Code Example:
import Foundation
public struct JobApplicant {
public let name: String
public let email: String
public var status: Status
public enum Status {
case new
case interview
case hired
case rejected
}
}
public struct Email {
public let subject: String
public let messageBody: String
public let recipientEmail: String
public let senderEmail: String
}
public struct EmailFactory {
public let senderEmail: String
public func createEmail(to recipient: JobApplicant) -> Email {
let subject: String
let messageBody: String
switch recipient.status {
case .new:
subject = "We Received Your Application"
messageBody = "Thanks for applying for a job here! " + "You should hear from us in 17-42 business days."
case .interview:
subject = "We Want to Interview You"
messageBody = "Thanks for your resume, \(recipient.name)! " + "Can you come in for an interview in 30 minutes?"
case .hired:
subject = "We Want to Hire You"
messageBody = "Congratulations, \(recipient.name)! " +
"We liked your code, and you smelled nice. " +
"We want to offer you a position! Cha-ching! $$$"
case .rejected:
subject = "Thanks for Your Application"
messageBody = "Thank you for applying, \(recipient.name)! " + "We have decided to move forward with other candidates. " + "Please remember to wear pants next time!"
}
return Email(subject: subject,messageBody: messageBody, recipientEmail: recipient.email, senderEmail: senderEmail)
}
}
使用方式:根据面试结果不同状态,发送不同的邮件
var jackson = JobApplicant(name: "Jackson Smith",
email: "jackson.smith@example.com", status: .new)
let emailFactory = EmailFactory(senderEmail: "RaysMinions@RaysCoffeeCo.com")
// New
print(emailFactory.createEmail(to: jackson), "\n")
// Interview
jackson.status = .interview print(emailFactory.createEmail(to: jackson), "\n")
// Hired
jackson.status = .hired print(emailFactory.createEmail(to: jackson), "\n")
需要注意点
并非所有多态对象都适合工厂模式。 如果对象非常简单,则可以将创建逻辑直接放在使用者中,例如视图控制器本身。
如果对象需要一系列步骤来构建它,那么最好使用 builder 模式或其他模式。
小结
- 工厂模式的目标是隔离对象创建逻辑。
- 工厂方法添加了一个抽象层来创建对象,从而减少了重复的代码。