iOS开发杂货铺

iOS中的工厂模式

2016-03-24  本文已影响5135人  wu2016

iOS中工厂模式我的理解是:利用OC语言的特性“多态”来创建不同的对象

如果后台提供的一个接口中有两至三种不同的数据,比如说有些是新闻,有些是图片,有些是音乐,那么该如非常方便的去使用这些数据在页面上展示出来呢?

在这里举个简单的例子:
先创建一个BaseModel,然后再News,Music,Images继承于BaseModel,然后在BaseModel中写一个便利构造器:

//创建一个便利构造器
+ (instancetype)initWithDictionary:(NSDictionary *)dictionary;
// 根据字典内提供的数据分别创建出对应的model来获取数据
+ (instancetype)initWithDictionary:(NSDictionary *)dictionary
{
    // 先使用当前类(父类)创建出model对象
    BaseModel *model = nil;
    
    // 根据字典中key对应的数据初始化不同的子类对象并将其返回给我们的父类
    if ([dictionary[@"tag"] isEqualToString:@"news"]) {
        model = [[News alloc] init];
    } else if ([dictionary[@"tag"] isEqualToString:@"images"]){
        model = [[Images alloc] init];
    } else if([dictionary[@"tag"] isEqualToString:@"music"]){
        model = [[Music alloc] init];
    }
    [model setValuesForKeysWithDictionary:dictionary];
    return model;
}

这里直接使用plist文件写一些死数据来展示,那么在tableView中的展示数组该如何获取值呢?

- (NSMutableArray *)dataArray
{
    if(!_dataArray)
    {
        _dataArray = [NSMutableArray array];
        NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
        NSArray *arr = [NSArray arrayWithContentsOfFile:path];
        
        for (NSDictionary *dic in arr) {
            BaseModel *model = [BaseModel initWithDictionary:dic];
            // 将不同子类创建出的model对象添加到我们的数组当中
            [_dataArray addObject:model];
        }
    }
    return _dataArray;
}

这样数组dataArray中存的就是我们想要的三种不同的对象。再去展示到页面上就可以了。
当然在展示到Cell上的时候,不同的Model对象需要的Cell也是不同的,所以Cell的创建也是可以通过工厂模工进行创建的,这里就不详细介绍了,下面链接中有这样的一个例子,有兴趣的可以下载下来看看。

Demo地址在这里,如果感觉没看懂可以去看看。以上都是我个人理解,如果有不对的地方请大牛们指正

上一篇下一篇

猜你喜欢

热点阅读