1. 程式人生 > 其它 >iOS 工廠模式的實際應用

iOS 工廠模式的實際應用

技術標籤: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/