美文网首页
【设计模式】10 - 工厂模式 (Factory Pattern

【设计模式】10 - 工厂模式 (Factory Pattern

作者: Lebron_James | 来源:发表于2019-05-06 19:22 被阅读0次

这篇文章是我阅读raywenderlich.comDesign Patterns by Tutorials的总结,文中的代码是我阅读书本之后根据自己的想法修改的。如果想看原版书籍,请点击链接购买。


工厂模式可以在不需要暴露创建逻辑的情况下,创建对象。主要有两部分组成:

  • Factory:负责创建对象。
  • Products:Factory创建的对象。

什么时候使用

当想要把Product的创建逻辑独立出来,而不是让使用者直接去创建时,使用这种模式。

简单Demo

假设我们在开发一个HR专用的邮箱,其中有一个需求是回复求职者的职位申请时,可以根据求职者目前的状态来创建模板邮件:

首先我们有两个模型,求职者JobApplicant和邮件Email:

struct JobApplicant {
    let name: String
    let email: String
    var status: Status

    enum Status {
        case new
        case interview
        case hired
        case rejected
    }
}

struct Email {
    let subject: String
    let messageBody: String
    let recipientEmail: String
    let senderEmail: String
}

然后是我们的邮件工厂EmailFactory:

struct EmailFactory {

    let senderEmail: String

    func createEmail(to recipient: JobApplicant, messageBody: String? = nil) -> Email {
        switch recipient.status {
        case .new:
            return Email(
                subject: "已收到你的求职申请",
                messageBody: messageBody ?? "感谢你申请我们的职位,我们会在24小时内回复你。",
                recipientEmail: recipient.email,
                senderEmail: senderEmail)

        case .interview:
            return Email(
                subject: "面试邀请",
                messageBody: messageBody ?? "你的简历已经通过筛选,请于明天上午10点到我们公司面试。",
                recipientEmail: recipient.email,
                senderEmail: senderEmail)

        case .hired:
            return Email(
                subject: "你已通过面试",
                messageBody: messageBody ?? "恭喜你,你已经通过我们公司的面试,请于下周一到我们公司报道。",
                recipientEmail: recipient.email,
                senderEmail: senderEmail)

        case .rejected:
            return Email(
                subject: "面试未通过",
                messageBody: messageBody ?? "因不符合我公司的要求,此次面试不通过。谢谢!",
                recipientEmail: recipient.email,
                senderEmail: senderEmail)
        }
    }
}

因为发邮件的时候,需要一个发件人,所以创建邮件工厂时,需要一个senderEmail参数;在createEmail根据求职者的不同状态来创建模板,并且还提供了一个可选的messageBody参数,如果不提供messageBody,我们就会使用默认的。

使用:

var lebron = JobApplicant(name: "Lebron James",
                          email: "lebronjames@example.com",
                          status: .hired)

let emailFactory = EmailFactory(senderEmail: "hr@company.com")
let emial = emailFactory.createEmail(to: lebron)

总结

当想要把实例的创建逻辑独立出来,可以使用工厂模式。但如果想要的实例非常简单,直接在用到的地方直接创建即可。如果这个实例需要一系列的步骤才能创建,最好使用Builder模式。

欢迎加入我管理的Swift开发群:536353151

下一篇文章:【设计模式】11 - 适配器模式 (Adapter Pattern)

相关文章

网友评论

      本文标题:【设计模式】10 - 工厂模式 (Factory Pattern

      本文链接:https://www.haomeiwen.com/subject/ctadoqtx.html