【設(shè)計模式】10 - 工廠模式 (Factory Pattern)

這篇文章是我閱讀raywenderlich.comDesign Patterns by Tutorials的總結(jié),文中的代碼是我閱讀書本之后根據(jù)自己的想法修改的。如果想看原版書籍,請點擊鏈接購買。


工廠模式可以在不需要暴露創(chuàng)建邏輯的情況下,創(chuàng)建對象。主要有兩部分組成:

  • Factory:負責(zé)創(chuàng)建對象。
  • Products:Factory創(chuàng)建的對象。

什么時候使用

當(dāng)想要把Product的創(chuàng)建邏輯獨立出來,而不是讓使用者直接去創(chuàng)建時,使用這種模式。

簡單Demo

假設(shè)我們在開發(fā)一個HR專用的郵箱,其中有一個需求是回復(fù)求職者的職位申請時,可以根據(jù)求職者目前的狀態(tài)來創(chuàng)建模板郵件:

首先我們有兩個模型,求職者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小時內(nèi)回復(fù)你。",
                recipientEmail: recipient.email,
                senderEmail: senderEmail)

        case .interview:
            return Email(
                subject: "面試邀請",
                messageBody: messageBody ?? "你的簡歷已經(jīng)通過篩選,請于明天上午10點到我們公司面試。",
                recipientEmail: recipient.email,
                senderEmail: senderEmail)

        case .hired:
            return Email(
                subject: "你已通過面試",
                messageBody: messageBody ?? "恭喜你,你已經(jīng)通過我們公司的面試,請于下周一到我們公司報道。",
                recipientEmail: recipient.email,
                senderEmail: senderEmail)

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

因為發(fā)郵件的時候,需要一個發(fā)件人,所以創(chuàng)建郵件工廠時,需要一個senderEmail參數(shù);在createEmail根據(jù)求職者的不同狀態(tài)來創(chuàng)建模板,并且還提供了一個可選的messageBody參數(shù),如果不提供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)

總結(jié)

當(dāng)想要把實例的創(chuàng)建邏輯獨立出來,可以使用工廠模式。但如果想要的實例非常簡單,直接在用到的地方直接創(chuàng)建即可。如果這個實例需要一系列的步驟才能創(chuàng)建,最好使用Builder模式。

歡迎加入我管理的Swift開發(fā)群:536353151。

下一篇文章:【設(shè)計模式】11 - 適配器模式 (Adapter Pattern)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容