漫漫之路 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进行管理.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值