漫漫之路 cell的工廠模式

實際開發中,tableview的cell可能有多種樣式, 這時我們一般會根據某個屬性的不同進行判斷.
以下圖爲例:
有三種情況: 1. 一張大圖加下面一行描述
2.兩張圖片
3.一下小圖 加兩個label
這三種情況一般就是3個cell,一個cell當然也能實現,不過判斷過於繁瑣,還需要考慮複用的問題,顯然不怎麼好用,而且一旦再加一種cell的話, 整個cell可能都要改變.
爲了便於多種cell同時存在,而且再添加cell的話也不會對其它cell有影響. 我們引入了cell工廠模式. 簡言之: Client 傳遞參數給工廠,工廠通過參數判斷到底生產什麼產品。主要利用面向對象的 多態的特性,父類指針指向子類對象.
這裏寫圖片描述

代碼

原始的數據
這裏寫圖片描述

  1. 創建基類的model 和cell
    這裏寫圖片描述

基類的model: 在基類的model裏面進行判斷到底是哪一個mode, 以多態的形式

// 根據字典內提供的數據分別創建出其對應的model來獲取數據
+ (instancetype)initWithDictionary:(NSDictionary *)dictionary
{
    // 先使用當前類(父類)創建出model對象
    BaseModel * model = nil;
    // 根據字典的key的數據初始化不同的子類對象並將其返回給我們的父類
    if ([dictionary[@"tag"] isEqualToString:@"Top News"]) {

        model = [[OneModel alloc]init];
    }else if ([dictionary[@"tag"] isEqualToString:@"imgextra"]){
        model = [[TwoModel alloc]init];
    }else {
        model = [[ThreeModel alloc]init];

    }

    [model setValuesForKeysWithDictionary:dictionary];

    return model;
}

基類的cell:
// 根據不同類型的model創建出不同的cell
+ (instancetype)initWithModel:(BaseModel *)model
{
// 根據我們的OC函數獲取我們的model類名並將其轉化爲OC字符串
NSString * modelName = [NSString stringWithUTF8String:object_getClassName(model)];
// 使用model的類名拼接一個”Cell”來獲取到我們的Cell類名
NSString * cellName = [modelName stringByAppendingString:@”Cell”];

// 根據我們所提供的cellName來獲取其對應的"cell子類"初始化一個cell對象返回給我們的父類對象
// 唯一標識符可以使用我們所提供的model來給予不同cell所對應的標識來重用
BaseTableViewCell * cell = [[NSClassFromString(cellName) alloc]initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:modelName];

return cell;

}

2.在tableView的返回cell的方法裏面:
- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

// 根據我們的indexPath.row獲取我們對應的model
BaseModel * baseModel = [_dataArray objectAtIndex:indexPath.row];
// 根據取出來的model獲取其對應的類名
NSString * modelName = [NSString stringWithUTF8String:object_getClassName(baseModel)];
// 根據不同的唯一標識重用不同的cell
BaseTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:modelName];
// 如果我們的cell不存在
if (cell == nil) {
    // 根據我們每行提供的model創建出對應的cell
    // 根據不同需求生產不同的產品

    cell = [BaseTableViewCell initWithModel:baseModel];
}
cell.baseModel = _dataArray[indexPath.row];
return cell;

}

cell的工廠模式的優點: 不需要在Controller裏面進行大量的判斷,而且cell之間的關聯不大,添加cell時對其他的cell沒有影響. 便於我們對cell進行管理.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章