1. 雜篇
- 代碼地址 HotCatLX Github
- 其余設計模式指引
- 更多的實際應用會不斷更新
- 語言 : swift
- 補充 : 代碼風格,設計不合理,請隨時告知.如果有好的具體案例,也請告訴我,如果覺得不錯,手動star
2. 基本概念
- 也許簡單工廠模式是開發中應用最多的設計模式,也是最基本的設計模式(甚至不是GoF總結出來的23種設計模式之一),但是你是否有總結過具體什么場景適用簡單工廠模式呢?
- 工廠 : 在容易變化的地方,用一個單獨的類來做創造實例的過程,這個就是工廠
- 使用場景
在有需要創建相同屬性或者方法的對象的地方,為了增加擴展性,在客戶端調用時不需要涉及到具體的對象創建過程,也不需要知道具體的對象類型,可以使用簡單工廠模式
客戶端調用只需要面向工廠,具體工廠內的創建對象過程不需要暴露給客戶端,且由于抽象類的抽取,在需要更多的對象創建過程,只需要增加新的子類即可
3. 組成和類圖
UML類圖
- 抽象類和子類
抽象類 : 因為需要簡單工廠類的使用場景應該是存在相同屬性或者方法的類的抽取,所以抽象類的抽取,使得簡單工廠類直接面向抽象類,能夠增加擴展性
子類 : 抽象類的具體實例化,具體方法的實現
- 簡單工廠類
在客戶端面向客戶端,根據傳參的不同,創建具體的子類對象
4. 具體案例
4.1 案例1 : 計算器
- 計算器功能,客戶端輸入兩個數和一個運算符,獲取運算結果
- 需求
- 客戶端調用時代碼盡量簡潔,再修改運算符時,不需要修改過多代碼,不需要知道具體有什么操作,只需要修改傳參即可
-
存在增加不同的運算符的需求
UML類圖
4.2 案例1代碼
- 抽象類
class Operation {
var numberFirst : Double = 0.0 //操作數1
var numberSec : Double = 0.0 //操作數2
func getResult() -> Double { //獲取結果
let result = 0.0
return result;
}
}
- 具體子類 : 子類字需要重寫getResult方法,在getResult里實現對應的方法
/*
* 加法子類
*/
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 {
//傳輸操作符字符串,根據字符串決定創建什么具體的運算操作子類
//如果有需求增加了新的運算操作,只需要增加switch判斷.并增加一個新的操作運算子類即可,客戶端調用不需要改動
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;
}
}
- 客戶端調用 : 增加運算符或者修改某一些運算規則.客戶端調用的地方不需要修改,或者只需要修改調用傳參的運算符
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. 思考
- 簡單工廠模式 或者 簡單工廠模式的變種方案 在開發中比比皆是
- 簡單工廠模式 & 多態 & 抽象類的結合在具體實踐中能帶來低耦合,高擴展的業務代碼