iOS 工廠模式的實際應用
阿新 • • 發佈:2020-12-15
技術標籤:iOSiosobjective-c
###工廠的三種設計模式
簡單工廠模式 (Simple Factory Pattern
):專門定義一個類(工廠類)來負責建立其他類的例項。可以根據建立方法的引數來返回不同類的例項,被建立的例項通常都具有共同的父類。(總結來說,其實就是把一大堆的if-else判斷由業務層,放到了工廠類裡面)
工廠方法模式 (Factory Method Pattern
)又稱為工廠模式,工廠父類負責定義建立產品物件的公共介面,而工廠子類則負責生成具體的產品物件,即通過不同的工廠子類來建立不同的產品物件。
抽象工廠模式(Abstract Factory Pattern
###工廠方法模式的應用
首先不管是工廠模式還是抽象工廠模式都必須具有以下四個結構,區別在於抽象工廠模式的抽象工廠類是不止生成一種產品的,所以抽象工廠模式的抽象產品類會有多個,而工廠模式的抽象產品類只有一個
- 抽象工廠類
- 抽象產品類
- 具體工廠類
- 具體產品類
####抽象工廠類
//抽象工廠 protocol BaseCellFactoryProtocol { func createCell(model: CellModel, tableView: UITableView, indexPath: IndexPath) -> BaseCellProtocol?//用來建立 cell }
####抽象產品類
//抽象產品
protocol BaseCellProtocol {
func configCell(_ model:CellModel)//配置 cell
}
上面兩個類即使新增 cell 的型別也是不會修改,符合開閉原則
####具體工廠類
根據抽象工廠具體實現,就是根據傳過來的model 的 id值確定建立哪一種 cell
class BaseCellFactory: BaseCellFactoryProtocol{ func createCell(model: CellModel, tableView: UITableView, indexPath: IndexPath) -> BaseCellProtocol? { switch model.id { case "1": let cell = tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(YellowCell.self), for: indexPath) as! YellowCell cell.configCell(model) return cell case "2": let cell = tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(GreenCell.self), for: indexPath) as! GreenCell cell.configCell(model) return cell case "3": let cell = tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(RedCell.self), for: indexPath) as! RedCell cell.configCell(model) return cell default: break } return nil } }
####具體產品類
//黃 CELL
class YellowCell: UITableViewCell,BaseCellProtocol {
func configCell(_ model: CellModel) {
self.textLabel?.text = model.string//傳值
self.backgroundColor = UIColor.yellow//自身特別處理 寫哪裡都無所謂 我就放著舉個例子
}
}
//綠 CELL
class GreenCell: UITableViewCell ,BaseCellProtocol{
func configCell(_ model: CellModel) {
textLabel?.text = model.string
self.backgroundColor = UIColor.green
}
}
// 紅 CELL
class RedCell: UITableViewCell ,BaseCellProtocol{
func configCell(_ model: CellModel) {
textLabel?.text = model.string
self.backgroundColor = UIColor.red
}
}
####呼叫物件類
呼叫就會非常清晰
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = BaseCellFactory().createCell(model: modelArr[indexPath.row], tableView: tableView, indexPath: indexPath)
return cell as! UITableViewCell
}
新增cell
型別也只需要修改具體工廠類 以及 新增具體產品類
###抽象工廠模式的應用
其實很簡單和上面差不多,我們只要新增一個抽象產品類,比如有不同 tableView
頭檢視的需求
這裡有一個iOS交流圈:891 488 181 可以來了解,分享BAT,阿里面試題、面試經驗,討論技術,裙裡資料直接下載就行, 大家一起交流學習!
####修改抽象工廠類
protocol BaseCellFactoryProtocol {
func createCell(model: CellModel, tableView: UITableView, indexPath: IndexPath) -> BaseCellProtocol?
func createCellHeadView(model: HeadModel) -> BaseCellHeadViewProtocol?
}
####新增抽象產品類
//抽象產品
//抽象 cell
protocol BaseCellProtocol {
func configCell(_ model:CellModel)
}
//抽象頭檢視
protocol BaseCellHeadViewProtocol {
func configCellHeadView(_ model:HeadModel)
}
####新增具體工廠方法
class BaseCellFactory: BaseCellFactoryProtocol{
func createCellHeadView(model: HeadModel) -> BaseCellHeadViewProtocol? {
switch model.id {
case "1":
return BlackView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40))
case "2":
return WhiteView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40))
default:
break
}
return nil
}
func createCell(model: CellModel, tableView: UITableView, indexPath: IndexPath) -> BaseCellProtocol? {
switch model.id {
case "1":
let cell = tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(YellowCell.self), for: indexPath) as! YellowCell
cell.configCell(model)
return cell
case "2":
let cell = tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(GreenCell.self), for: indexPath) as! GreenCell
cell.configCell(model)
return cell
case "3":
let cell = tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(RedCell.self), for: indexPath) as! RedCell
cell.configCell(model)
return cell
default:
break
}
return nil
}
}
####新增具體產品類
class BlackView: UIView,BaseCellHeadViewProtocol {
lazy var label:UILabel = {
let label = UILabel(frame: self.bounds)
return label
}()
func configCellHeadView(_ model: CellModel) {
self.backgroundColor = UIColor.black
self.label.text = model.string
}
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(label)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class WhiteView: UIView ,BaseCellHeadViewProtocol{
lazy var label:UILabel = {
let label = UILabel(frame: self.bounds)
return label
}()
func configCellHeadView(_ model: CellModel) {
self.backgroundColor = UIColor.white
self.label.text = model.string
}
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(label)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
####具體實現呼叫
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
return BaseCellFactory().createCellHeadView(model: headArr[section]) as? UIView
}
文章連結:https://juejin.cn/post/6904560073801105415/