這篇文章是我閱讀raywenderlich.com的Design 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。