1. 雜篇
- 代碼地址 HotCatLX Github
- 其余設(shè)計(jì)模式指引
- 更多的實(shí)際應(yīng)用會不斷更新
- 語言 : swift
- 補(bǔ)充 : 代碼風(fēng)格,設(shè)計(jì)不合理,請隨時(shí)告知.如果有好的具體案例,也請告訴我,如果覺得不錯,手動star
2. 基本概念
- 也許簡單工廠模式是開發(fā)中應(yīng)用最多的設(shè)計(jì)模式,也是最基本的設(shè)計(jì)模式(甚至不是GoF總結(jié)出來的23種設(shè)計(jì)模式之一),但是你是否有總結(jié)過具體什么場景適用簡單工廠模式呢?
- 工廠 : 在容易變化的地方,用一個單獨(dú)的類來做創(chuàng)造實(shí)例的過程,這個就是工廠
- 使用場景
在有需要創(chuàng)建相同屬性或者方法的對象的地方,為了增加擴(kuò)展性,在客戶端調(diào)用時(shí)不需要涉及到具體的對象創(chuàng)建過程,也不需要知道具體的對象類型,可以使用簡單工廠模式
客戶端調(diào)用只需要面向工廠,具體工廠內(nèi)的創(chuàng)建對象過程不需要暴露給客戶端,且由于抽象類的抽取,在需要更多的對象創(chuàng)建過程,只需要增加新的子類即可
3. 組成和類圖
UML類圖
- 抽象類和子類
抽象類 : 因?yàn)樾枰唵喂S類的使用場景應(yīng)該是存在相同屬性或者方法的類的抽取,所以抽象類的抽取,使得簡單工廠類直接面向抽象類,能夠增加擴(kuò)展性
子類 : 抽象類的具體實(shí)例化,具體方法的實(shí)現(xiàn)
- 簡單工廠類
在客戶端面向客戶端,根據(jù)傳參的不同,創(chuàng)建具體的子類對象
4. 具體案例
4.1 案例1 : 計(jì)算器
- 計(jì)算器功能,客戶端輸入兩個數(shù)和一個運(yùn)算符,獲取運(yùn)算結(jié)果
- 需求
- 客戶端調(diào)用時(shí)代碼盡量簡潔,再修改運(yùn)算符時(shí),不需要修改過多代碼,不需要知道具體有什么操作,只需要修改傳參即可
-
存在增加不同的運(yùn)算符的需求
UML類圖
4.2 案例1代碼
- 抽象類
class Operation {
var numberFirst : Double = 0.0 //操作數(shù)1
var numberSec : Double = 0.0 //操作數(shù)2
func getResult() -> Double { //獲取結(jié)果
let result = 0.0
return result;
}
}
- 具體子類 : 子類字需要重寫getResult方法,在getResult里實(shí)現(xiàn)對應(yīng)的方法
/*
* 加法子類
*/
class OperationAdd: Operation {
override func getResult() -> Double {
var result = 0.0
result = numberFirst + numberSec
return result
}
}
/*
* 減法子類
*/
class OperationSub: Operation {
override func getResult() -> Double {
var result = 0.0
result = numberFirst - numberSec
return result
}
}
- 簡單工廠
class OperationFactory {
//傳輸操作符字符串,根據(jù)字符串決定創(chuàng)建什么具體的運(yùn)算操作子類
//如果有需求增加了新的運(yùn)算操作,只需要增加switch判斷.并增加一個新的操作運(yùn)算子類即可,客戶端調(diào)用不需要改動
func operationWithOperator(operatorStr : String) -> Operation {
var operation = Operation();
switch operatorStr {
case "+":
operation = OperationAdd()
case "-":
operation = OperationSub()
case "*":
operation = OperationMul()
case "/":
operation = OperationDiv()
default:
operation = Operation();
}
return operation;
}
}
- 客戶端調(diào)用 : 增加運(yùn)算符或者修改某一些運(yùn)算規(guī)則.客戶端調(diào)用的地方不需要修改,或者只需要修改調(diào)用傳參的運(yùn)算符
override func viewDidLoad() {
super.viewDidLoad()
let once = OperationFactory().operationWithOperator(operatorStr: "+")
once.numberFirst = 15
once.numberSec = 5
let result = once.getResult()
print("result is ",result)
}
5. 思考
- 簡單工廠模式 或者 簡單工廠模式的變種方案 在開發(fā)中比比皆是
- 簡單工廠模式 & 多態(tài) & 抽象類的結(jié)合在具體實(shí)踐中能帶來低耦合,高擴(kuò)展的業(yè)務(wù)代碼